Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:暴力搜索可切割的路径

Posted by cavatina2016 at 2019-09-12 21:29:35 on Problem 2798 and last updated at 2019-09-12 21:31:01
In Reply To:贴个代码,献丑了 Posted by:cavatina2016 at 2019-09-12 21:24:52
> #include <stdio.h>
> #include <cstring>
> #define MAX_N	20
> 
> 
> int N, M;
> char board[MAX_N][MAX_N + 1];
> bool points[MAX_N + 1][MAX_N + 1];
> bool states[MAX_N + 1][MAX_N + 1][4];
> 
> 
> enum Dir
> {
> 	Left = 0,
> 	Right,
> 	Up,
> 	Down
> };
> 
> typedef bool (*FUNC)(int r, int c, int& r2, int& c2);
> FUNC funcs[4];
> 
> 
> int oppdir(int dir)
> {
> 	if (dir == Left) return Right;
> 	if (dir == Right) return Left;
> 	if (dir == Up) return Down;
> 	return Up;
> }
> 
> 
> bool up(int r, int c, int& r2, int& c2)
> {
> 	if (r <= 0) return false;
> 	if (c <= 0 || c >= M) return false;
> 	if (board[r - 1][c - 1] == board[r - 1][c]) return false;
> 	r2 = r - 1;
> 	c2 = c;
> 	return true;
> }
> 
> 
> bool down(int r, int c, int& r2, int& c2)
> {
> 	if (r >= N) return false;
> 	if (c <= 0 || c >= M) return false;
> 	if (board[r][c - 1] == board[r][c]) return false;
> 	r2 = r + 1;
> 	c2 = c;
> 	return true;
> }
> 
> 
> bool left(int r, int c, int& r2, int& c2)
> {
> 	if (c <= 0) return false;
> 	if (r <= 0 || r >= N) return false;
> 	if (board[r - 1][c - 1] == board[r][c - 1]) return false;
> 	r2 = r;
> 	c2 = c - 1;
> 	return true;
> }
> 
> 
> bool right(int r, int c, int& r2, int& c2)
> {
> 	if (c >= M) return false;
> 	if (r <= 0 || r >= N) return false;
> 	if (board[r - 1][c] == board[r][c]) return false;
> 	r2 = r;
> 	c2 = c + 1;
> 	return true;
> }
> 
> 
> bool cut(int r, int c, int dir, bool turn)
> {
> 	if (states[r][c][dir]) return false;
> 
> 	int r2, c2;
> 	if (funcs[dir](r, c, r2, c2)) {
> 		if (points[r2][c2]) {
> 			states[r2][c2][oppdir(dir)] = true;
> 			states[r][c][dir] = true;
> 			points[r][c] = true;
> 			//printf("%d %d\n", r, c);
> 			return true;
> 		}
> 		if (cut(r2, c2, dir, turn)) {
> 			states[r2][c2][oppdir(dir)] = true;
> 			states[r][c][dir] = true;
> 			points[r][c] = true;
> 			//printf("%d %d\n", r, c);
> 			return true;
> 		}
> 	}
> 
> 	if (turn) return false;
> 
> 	if (dir == Up || dir == Down) {
> 		if (cut(r, c, Left, true)) {
> 			return true;
> 		}
> 		if (cut(r, c, Right, true)) {
> 			return true;
> 		}
> 	}
> 	else {
> 		if (cut(r, c, Up, true)) {
> 			return true;
> 		}
> 		if (cut(r, c, Down, true)) {
> 			return true;
> 		}
> 	}
> 	return false;
> }
> 
> 
> int calc()
> {
> 	for (int i = 0; i <= M; ++i) {
> 		points[0][i] = true;
> 		points[N][i] = true;
> 	}
> 	for (int i = 0; i <= N; ++i) {
> 		points[i][0] = true;
> 		points[i][M] = true;
> 	}
> 
> 	int res = 1;
> 	while (true) {
> 		bool flag = false;
> 
> 		//printf("cut %d\n", res);
> 
> 		for (int i = 0; i <= N && !flag; ++i) {
> 			for (int j = 0; j <= M && !flag; ++j) {
> 				if (!points[i][j]) continue;
> 
> 				for (int k = 0; k < 4; ++k) {
> 					if (cut(i, j, k, false)) {
> 						flag = true;
> 						break;
> 					}
> 				}
> 			}
> 		}
> 
> 		if (flag) {
> 			++res;
> 		}
> 		else {
> 			break;
> 		}
> 	}
> 
> 	return res;
> }
> 
> 
> int main()
> {
> 	funcs[Up] = up;
> 	funcs[Down] = down;
> 	funcs[Left] = left;
> 	funcs[Right] = right;
> 
> 	scanf_s("%d %d", &N, &M);
> 	while (N < 1 || N > MAX_N || M < 1 || M > MAX_N) printf("...");
> 
> 	for (int i = 0; i < N; ++i) {
> 		scanf_s("%s", board[i], MAX_N + 1);
> 	}
> 
> 	printf("%d\n", calc());
> 	return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator