POJ 3561 Pseudographical recognizer
【题意简述】:矩阵中除了‘.’仅仅能出现一种符号。是这些之中的一个‘‑’, ‘|’, ‘\’, or ‘/’,并且就是当除了‘.’之外还仅仅有一种符号时。这个符号还必须连成一条直线,否则就是错的,这个时候就能够输出CORRECT。否则当有两种以上符号的时候。就是错误。
还有就是当仅仅有‘.’时,也是不正确的。
【分析】:模拟过程,将整个思路想清晰。
本代码參考:http://www.cnblogs.com/gongling/archive/2012/08/05/2623676.html。
// 208K 125ms #include<cstdio> #include<iostream> using namespace std; #define MAX_LEN 101 #define is_valid(x, y) ((x)>=0 && (x)<N && (y)>=0 && (y)<M) int N, M; char image[MAX_LEN][MAX_LEN]; int visited[MAX_LEN][MAX_LEN]; int flag; void mark(int i, int j, int dx, int dy, char ch) { while(is_valid(i+dx, j+dy) && image[i+dx][j+dy]==ch) { visited[i+dx][j+dy] = 1; i += dx; j += dy; } } void solve() { int i, j; char ch; for(i=0; i<N; i++) { for(j=0; j<M; j++) { ch = image[i][j]; if(ch!='.' && !visited[i][j]) { visited[i][j] = 1; switch(ch) { case '-': ++flag; mark(i, j, 0, 1, ch); break; case '|': ++flag; mark(i, j, 1, 0, ch); break; case '\\': ++flag; mark(i, j, 1, 1, ch); break; case '/': ++flag; mark(i, j, 1, -1, ch); break; } } } } } int main() { int i, tests; scanf("%d", &tests); while(tests--) { scanf("%d %d", &N, &M); for(i=0; i<N; i++) scanf("%s", image[i]); memset(visited, 0, sizeof(visited)); flag = 0; solve(); if(flag == 1) printf("CORRECT\n"); else printf("INCORRECT\n"); } }