题目大意:
给出一个矩阵,由大写字母覆盖,判断同一个大写字母能不能走成一个圈。
思路分析:
注意题意是走成一个圈,而不是矩形,一开始在这耽误了好长时间,而要求走成一个圈,即从这个点开始,沿着上下左右方向走能否最终走回这个点,用dfs,限制条件就是这条路径的颜色必须相同。而最小的圈其实就是走成一个2*2的矩形,那么最少的步数也就是4,那么判断是否回到原点,也就是当前点的坐标等于原点坐标的同时,所走的步数一定是大于等于4的。
代码实现:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[55][55],visit[55][55];
int step,flag;
char ans;
int xx,yy,n,m;
int d[4][2]={-1,0,1,0,0,-1,0,1};
void f(int x,int y){
if(x==xx&&y==yy&&step>=4){
flag=1;
return;
}
if(flag==1) return;
if(x<0||x>n-1||y<0||y>m-1) return;
if(str[x][y]!=ans||visit[x][y]==1) return;
visit[x][y]=1;
for(int i=0;i<4;i++){
step++;//由当前的点走到下一个点,步数加1;
f(x+d[i][0],y+d[i][1]);
step--;//这个方向失败了,步数退回一步,从当前点的另一个方向重新出发
}
visit[x][y]=0;//这个点的四个方向都失败,退回到上一个点,
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++)
scanf("%s",&str[i]);
flag=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
memset(visit,0,sizeof(visit));
if(flag==1) break;
ans=str[i][j];
step=0;
xx=i,yy=j;
f(i,j);
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
}