poj 1501 dfs(找字串)
阿新 • • 發佈:2018-12-24
題意:給出一個字元矩陣,然後下面每一行的字串和其匹配,只能按照直線進行匹配,橫、豎、斜。如果匹配成功則輸出首字母和末字母匹配成功的位置。
思路:DFS,如果找到下一個字母,就繼續搜。
#include<iostream> using namespace std; char a[105][105]; int N,len2,sx,sy,ex,ey; bool flag,vis[105][105]; char s[105]; int dir[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}}; void dfs(int i,int j,int m,int k) { int x,y; if(flag) return; if(a[i][j]==s[len2-1]&&m==len2)//必須加個m==len2因為給出的字串可能有重複字母 { ex=i;ey=j; flag=1; return; } x=i+dir[k][0]; y=j+dir[k][1]; if(!vis[x][y]&&x>=0&&x<N&&y>=0&&y<N&&a[x][y]==s[m]) { vis[x][y]=1; dfs(x,y,m+1,k); vis[x][y]=0; } } int main() { int i,j,k; while(scanf("%d",&N)!=EOF) { for(i=0;i<N;i++) cin>>a[i]; while(scanf("%s",s)!=EOF) { if(s[0]=='0') break; len2=strlen(s); sx=sy=ex=ey=0; flag=0; for(i=0;i<N;i++) for(j=0;j<N;j++) if(a[i][j]==s[0]) {//找到第一個字母后,按同一個方向搜尋 for(k=0;k<8;k++) { memset(vis,0,sizeof(vis)); dfs(i,j,1,k); if(flag) { sx=i;sy=j; goto loop; } } } loop: if(flag) printf("%d,%d %d,%d\n",sx+1,sy+1,ex+1,ey+1); else printf("Not found\n"); } } }