您的位置:首页 > 其它

1416 两点

2018-02-14 12:58 253 查看
1416 两点

题目来源: CodeForces

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注

福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个n×m单元上玩的。像这样:



每一个单元有包含一个有色点。我们将用不同的大写字母来表示不同的颜色。

这个游戏的关键是要找出一个包含同一颜色的环。看上图中4个蓝点,形成了一个环。一般的,我们将一个序列 d1,d2,…,dk 看成一个环,当且仅当它符合下列条件时:

1. 这k个点不一样,即当 i≠j时, di 和 dj不同。

2. k至少是4。

3. 所有的点是同一种颜色。

4. 对于所有的 1≤i≤k-1: di 和 di+1 是相邻的。还有 dk 和 d1 也应该相邻。单元 x 和单元 y 是相邻的当且仅当他们有公共边。

当给出一幅格点时,请确定里面是否有环。

Input

单组测试数据。

第一行包含两个整数n和m (2≤n,m≤50):板子的行和列。

接下来n行,每行包含一个有m个字母的串,表示当前行每一个点的颜色。每一个字母都是大写字母。

Output

如果有环输出Yes,否则输出No。

Input示例

3 4

AAAA

ABCA

AAAA

3 4

AAAA

ABCA

AADA

Output示例

Yes

No

#include<iostream>
#include<cstdio>
using namespace std;
char _map[55][55];
int father[5555];
int n,m,flag=1;
int turn(int x,int y)
{
return x*m+y;
}
int find_father(int x)
{
if (father[x]==x)
return x;
else
return father[x]=find_father(father[x]);
}
void join(int x,int y)
{
int x_father=find_father(x);
int y_father=find_father(y);
if (x_father==y_father)
flag=0;
else
father[x_father]=father[y_father]=min(x_father,y_father);
}
int main()
{

while(cin>>n>>m)
{
flag=1;
getchar();
for (int i=0;i<n;i++)
gets(_map[i]);
for(int i=0;i<=n*m;i++)
father[i]=i;
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
if(i!=n-1&&_map[i][j]==_map[i+1][j])
join(turn(i,j),turn(i+1,j));
if(j!=m-1&&_map[i][j]==_map[i][j+1])
join(turn(i,j),turn(i,j+1));
if(!flag)
break;
}
if(!flag)
break;
}
if (!flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: