题目大意:在图中找到一个字符可以围成一个环(至少有环四个相同元素)
题目思路:对当前点进行搜索,如果发现可以达到某个已经被查找过的点,且当前点不是由这个点而来,则查找成功。
#include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 1005 using namespace std; char Map[MAX][MAX],op;//op记录当前字符 struct node { int x,y; }pre[MAX][MAX];//pre数组记录当前点的前驱节点 int n,m,vis[MAX][MAX],ok,v[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int check(int x,int y,int a,int b) { if(a>=0 && a<n && b>=0 && b<m && (pre[x][y].x!=a ||pre[x][y].y!=b) && Map[a][b]==op) return 1; return 0; } void DFS(int x,int y) { for(int i=0;i<4;i++) { int a=x+v[i][0]; int b=y+v[i][1]; if(check(x,y,a,b)) { if(vis[a][b]) { ok=1; return; } pre[a][b].x=x; pre[a][b].y=y; vis[a][b]=1; DFS(a,b); } } if(ok==1) return; } int main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF) { ok=0; memset(vis,0,sizeof(vis)); for(i=0;i<MAX;i++) { for(j=0;j<MAX;j++)//初始化每个点的前驱点都是本身 { pre[i][j].x=i; pre[i][j].y=j; } } for(i=0;i<n;i++) scanf("%s",Map[i]); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(!vis[i][j]) { op=Map[i][j]; vis[i][j]=1; DFS(i,j); } if(ok) break; } if(ok) break; } if(ok) printf("Yes\n"); else printf("No\n"); } return 0; }
时间: 2024-10-20 17:37:31