錯了20多遍 做了n天的搜尋!!
阿新 • • 發佈:2018-11-22
題:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2121#problem/I
3 april purple quilt
5
rprit
ahqln
ietep
zrysg
ogwey
3
pel aup bcr
0
一道把老子你弄得死去活來的題(只是因為自己菜)
題意:
先給你n個串,然後給個t×t的表,從表中遍歷找尋這n個串,如果有就輸出這個串,其中表中的q只能當作qu。
這個題我真的服了,對搜尋的理解還是不到位,dfs裡的return 不是結束條件,另外搜尋不到你原先的標記要清零,t的原因是因為你會把所有的情況遍歷? 好多好多
看程式碼把
#include <iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<cstdlib> #include<map> using namespace std; string s[500]; char a[10][10]; int vis[10][10]; bool flag[1000]; int n; int f[8][2]= {{1,0},{-1,0},{0,1},{0,-1},{-1,1},{-1,-1},{1,1},{1,-1}}; void dfs(int x,int y,int k,int ge) { vis[x][y]=1; if(flag[k]==1) // 沒有這個if的話,當你條件成立,你會繼續搜尋他的上一層。比如這個字母的上下左右都是a,你上是a,你不會接著停止,而是搜尋別的可能,會耗時間長。 return ; if(s[k][ge]=='q') if(s[k][ge+1]=='u') ge+=1; else return ; if(ge==s[k].size()-1) { flag[k]=1; return ; } for(int i=0; i<=7; i++) { int xx=f[i][0]+x; int yy=f[i][1]+y; if(vis[xx][yy]==0&&xx>=0&&xx<=n-1&&yy>=0&&yy<=n-1&&a[xx][yy]==s[k][ge+1]) { dfs(xx,yy,k,ge+1); } } vis[x][y]=0; return ; } int main() { int t,i,chu,j,k; cin>>t; for(i=0; i<=t-1; i++) cin>>s[i]; sort(s,s+t); while(cin>>n&&n) { for(i=0; i<=n-1; i++) { for(j=0; j<=n-1; j++) cin>>a[i][j]; } for(i=0; i<=t-1; i++) { chu=0; int zz=0; memset(flag,0,sizeof(flag)); for(j=0; j<=n-1; j++) { for(k=0; k<=n-1; k++) { memset(vis,0,sizeof(vis)); if(a[j][k]==s[i][0]) { zz++; dfs(j,k,i,0); if(flag[i]==1) { chu=1; cout<<s[i]<<endl; break; } } } if(chu==1) { break; } } } cout<<"-"<<endl; } return 0; }