C 眼力大作战
Time Limit:1000MS Memory Limit:65535K
题型: 编程题 语言: 无限制
描述
某一天,bsc要给集训队表现出色的cdm和xxy发奖品了,可是bsc只有一件奖品,不能同时分给两个人,所以只能想个办法来决定谁来领奖品了。 Bsc给了一张表格,里面填满了各种大写字母,要求从里面找出一个正方形,其中正方形的左上顶点对应字符S,右上顶点对应字符C,左下顶点 对应字符A,右下顶点对应U,并且在该正方形区域内存在一个三角形,其中位置(i,j)对应字符A,(i+1,j-1)对应字符C,(i+1,j+1)对应字符M。 谁先找到呢,就算谁获胜了。但是呢,由于xxy最近要忙于期末复习了,所以没有时间处理这种小问题,但是xxy还是很希望能拿到奖品的, 所以只能求助未来的Acmer,你啦!
输入格式
第一行一个整数T,表示样例数 第二行两个整数n, m,分别表示bsc给的表格的行数和列数 1 <= n <= 15, 1 <= m <= 15 第三到n + 2行,每一行是m个大写字母
输出格式
输出T行,若表格中符合上述要求,输出 ”Yes”, 否则输出”No” (不包括双引号)
输入样例
2 3 3 SAC CMM AMU 7 5 MUSUB SSMSS CMXUU UCSCC MACCA ACCMM SUGCM
输出样例
Yes No
思路:用了暴力枚举,因为当时实在没想到什么好的方法。我们先分析下题目,我们必须先找出这样的正方形,然后再从正方形中找出‘ACM’。 注意题目条件的“正方形”字眼,正方形每条边都相等,你想到了什么?没错,如果说我找到‘S’,我就令‘s’的坐标是(x.y),那么其他字符的位置就是(x+k,y),(x+k,y+k),(x,y+k),(k=1,2,3……)我们只要枚举k检测这三个位置是否满足要求,if满足的话,再枚举就可以了。
#include <stdio.h> #include <stdlib.h> int main() { int T; int i,j,k,d,n,m,p1,q1,l,flag=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); getchar(); char test[20][20]={'\0'}; for(i=0;i<n;i++) scanf("%s",test[i]); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(test[i][j]=='S') { p1=i; q1=j; for(d=2;;d++) { if(p1+d<n&&q1+d<m) { if(test[p1][q1+d]=='C'&&test[p1+d][q1]=='A'&& test[p1+d][q1+d]=='U') { for(k=p1;k<=p1+d;k++) { for(l=q1+1;l<=q1+d;l++) { if(test[k][l]=='A'&&test[k+1][l-1]=='C'&&test[k+1][l+1]=='M') { flag=1; break; } } } } } else break; } } } if(flag==1) break; } if(flag==0) printf("No\n"); else printf("Yes\n"); flag=0; } return 0; }