Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴个代码,献丑了#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator