您的位置:首页 > 其它

ZCMU—1728

2016-12-26 11:19 218 查看

1728: B

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 59  Solved: 33

[Submit][Status][Web
Board]

Description

有一个n*m的矩阵,矩阵中的每个格子都涂有颜色。不同的颜色由不同的大写字母表示。如果这个矩阵中至少有一个全部由一种颜色组成的环,那么称这个矩阵是一个完美的矩阵。这个条件等价于存在一个格子的序列d1, d2, d3, …, dk满足下列条件:

1.       对于所有的di和dj,若i != j,那么di != dj。
2.       K >= 4。
3.       所有的格子都属于同一种颜色。
4.       对于所有的1 <= I <= k – 1,di 都和di + 1相邻,当然dk 和d1也必须相邻,相邻的意思是两个格子有一条公共边。
对于一个给定的矩阵,你需要输出这个矩阵是不是完美的矩阵。

Input

输入包含多组测试数据。每组测试数据的第一行有两个正整数n,m(2 <= n, m <= 50),代表这个矩阵的大小。接下来n行,每行有m个大写字母,代表这个矩阵。

Output

对于每组测试数据,输出一行,如果这个矩阵的完美矩阵则输出“Yes”,否则输出“No”。

Sample Input

3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
4 4
YYYR
BYBY
BBBY
BBBY
7 6
AAAAAB
ABBBAB
ABAAAB
ABABBB
ABAAAB
ABBBAB
AAAAAB
2 13
ABCDEFGHIJKLMN
OPQRSTUVWXYZ

Sample Output

Yes
No
Yes
Yes
No

【分析】

判断有没有回路...图不大,dfs也不会超时,因为每个点只会走一次。
当遇到一个没有判断过的点,那么就把跟这个点相连的所有点染色,如果染色途中发现碰到已经被染色并且颜色相同的位置时,就可以判定这一条是回路,染色的时候记得记录一下当前状态是从哪个状态来的(也就是xx→x,yy→y),染色的时候别回头就行了。
【代码】
#include <stdio.h>
#include <string.h>
char s[60][60];
int f[60][60];
int t,n,m;

void find(int xx,int yy,int x,int y,int now)
{
// printf("%d   %d**%c\n",x,y,now);
if (t||f[x][y]==now)
{
t=1;return;
}
f[x][y]=now;
if (x>0 && s[x-1][y]==now && (x-1!=xx || y!=yy)) find(x,y,x-1,y,now);
if (y>0 && s[x][y-1]==now && (y-1!=yy || x!=xx)) find(x,y,x,y-1,now);
if (x<=n-1 && s[x+1][y]==now && (x+1!=xx || y!=yy)) find(x,y,x+1,y,now);
if (y<=m-1 && s[x][y+1]==now && (x!=xx || y+1!=yy)) find(x,y,x,y+1,now);
}

int main()
{
while (~scanf("%d%d",&n,&m))
{
t=0;
memset(f,0,sizeof(f));
for (int i=0;i<n;i++) scanf("%s",s[i]);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if (!f[i][j])
{
find(-1,-1,i,j,s[i][j]);
if (t) {puts("Yes");goto out;}
}
printf("No\n");
out:;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: