http://codeforces.com/problemset/problem/510/B
找存不存在某一个字母能构成一个环
#include<bits/stdc++.h>
using namespace std;
int flag;
int sx,sy; int n,m;
char ma[55][55];
bool vis[55][55];
void dfs(char md,int x,int y,int js)
{
if(flag==1)
return ;
if(x+1==sx&&y==sy&&js>=4)
{
flag=1;
return ;
}
if(x+1>=0&&x+1<n&&y>=0&&y<m&&ma[x+1][y]==md&&vis[x+1][y]==0)
{
vis[x+1][y]=1;
dfs(md,x+1,y,js+1);
}
if(flag==1)
return ;
if(x-1==sx&&y==sy&&js>=4)
{
flag=1;
return ;
}
if(x-1>=0&&x-1<n&&y>=0&&y<m&&ma[x-1][y]==md&&vis[x-1][y]==0)
{
vis[x-1][y]=1;
dfs(md,x-1,y,js+1);
}
if(flag==1)
return ;
if(x==sx&&y+1==sy&&js>=4)
{
flag=1;
return ;
}
if(x>=0&&x<n&&y+1>=0&&y+1<m&&ma[x][y+1]==md&&vis[x][y+1]==0)
{
vis[x][y+1]=1;
dfs(md,x,y+1,js+1);
}
if(flag==1)
return ;
if(x==sx&&y-1==sy&&js>=4)
{
flag=1;
return ;
}
if(x>=0&&x<n&&y-1>=0&&y-1<m&&ma[x][y-1]==md&&vis[x][y-1]==0)
{
vis[x][y-1]=1;
dfs(md,x,y-1,js+1);
}
if(flag==1)
return ;
}
int main(){
while(cin>>n>>m)
{
flag=0;
for(int i=0;i<n;i++)
{
cin>>ma[i];
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(flag)break;
memset(vis,0,sizeof(vis));
sx=i;sy=j;
vis[i][j]=1;
dfs(ma[i][j],i,j,1);
}
if(flag)break;
}
if(flag)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
本文提供了一段针对CodeForces平台上的特定题目(编号510/B)的C++代码解析,该代码用于判断在一个给定的字符网格中是否存在某个字母能够形成闭环路径。通过深度优先搜索算法实现,遍历所有可能的起始位置并检查是否能够回到起点。
355

被折叠的 条评论
为什么被折叠?



