AC Again
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 386 Accepted Submission(s): 135
Problem Description
“AC”这个单词大概是我们 ACMers 最希望听到的回答了。不过如果把它写下来,你还能认识吗?
现在给你一幅由点阵构成的图,它代表 'A' 或 'C' 的一个字母。你的任务就是把它们识别出来。
注意:
1.笔划可能有粗有细,但是我们保证字符在外形上是肉眼可辨别的。
2.我们保证笔划是连贯的,即对于任意一个有笔划的点,在它周围八个点内有一点有笔划,这两点就是相连贯的。
3.'A','C'这两个字符可能会按90,180,270这样的角度旋转。
现在给你一幅由点阵构成的图,它代表 'A' 或 'C' 的一个字母。你的任务就是把它们识别出来。
注意:
1.笔划可能有粗有细,但是我们保证字符在外形上是肉眼可辨别的。
2.我们保证笔划是连贯的,即对于任意一个有笔划的点,在它周围八个点内有一点有笔划,这两点就是相连贯的。
3.'A','C'这两个字符可能会按90,180,270这样的角度旋转。
Input
本题目包含多组测试,每两组测试之间用一个或多个空行隔开。
对于每组数据,系统将给你一个肉眼可以辨别的图形表示一个字符'A' 或 'C'。
系统保证每个图形的大小在 50 * 50 一下。
输入数据只包含 ' '(空格)和'*'两种字符,其中'*'表示该点有笔划。
对于每组数据,系统将给你一个肉眼可以辨别的图形表示一个字符'A' 或 'C'。
系统保证每个图形的大小在 50 * 50 一下。
输入数据只包含 ' '(空格)和'*'两种字符,其中'*'表示该点有笔划。
Output
对于每组数据,根据图形,在一行内输出 A 或 C。
Sample Input
* * * ***** * * ****** * * * ******
Sample Output
AC
http://acm.hdu.edu.cn/showproblem.php?pid=1582
// 刚开始有点难想到是搜索
// A C的区别是什么? 关键 就是 A 构成了一个小环
// 一开始 我想到的是搜索 每一个点 只要 一个点 经过几步 走到自己 是 A (深搜做的超时)
//可以试试广搜 还有更好的方法 (填充法)
// 是搜索 最好考虑广搜#include<stdio.h> #include<string.h> char ap[55][55]; void dfs(int x,int y) { if(x>=0&&x<55&&y>=0&&y<55&&ap[x][y]=='#') { ap[x][y]='*'; dfs(x-1,y); dfs(x+1,y); dfs(x,y-1); //A有个环搜不进去 必然里面留下# dfs(x,y+1); } } int main() { int i,j,flag,k; memset(ap,'#',sizeof(ap)); while(gets(ap[1]+1)) { { if(ap[1][1]=='\0') continue; k=2; while(gets(ap[k]+1)&&ap[k++][1]!='\0'); } for(i=0;i<55;i++) for(j=0;j<55;j++) if(ap[i][j]!='*') ap[i][j]='#'; dfs(0,0); flag=0; for(i=1; i<54; i++) { for(j=1; j<54; j++) if(ap[i][j]=='#') { flag=1; break; } if(flag==1) break; } if(flag) printf("A\n"); else printf("C\n"); memset(ap,'#',sizeof(ap)); } return 0; }