Harry 可以念这个咒语:"big-got-them".
搜索专题的第三道,恩,一道简单的DFS题目呀。。来练练手吧!
我用的两种方法做的,第一种就是直接用一个二维数组存,然后从头向后寻找,
第二种就是用类似于字母表,26*26的,比如我们输入abc,abce,af 用字母表就可以表示,a可以到达c,e,f。
最好用一个vis数组来判断该条是否读过,因为如果不用,abc和cba可能导致错误(超时)
第一种方法:
// hdu 1181 #include <iostream> #include <string> #include <string.h> using namespace std; char grammer[10001][2]; bool vis[10001]; int n; bool ispos; void dfs(char c) { if(ispos==true) return; if(c=='b') { ispos=true; return; } int i; for(i=0;i<n;++i) { if(vis[i]==1) continue; if(grammer[i][0]==c) { vis[i]=1; dfs(grammer[i][1]); vis[i]=0; } } return; } int main() { string str; int len; n=0; while(cin>>str) { if(str[0]=='0') { memset(vis,0,sizeof(vis)); ispos=false; dfs('m'); if(ispos) cout<<"Yes."<<endl; else cout<<"No."<<endl; n=0; continue; } len=str.length(); if(str[len-1]==str[0]) continue; grammer[n][0]=str[len-1]; grammer[n++][1]=str[0]; } return 0; }
第二种方法:字母表
// plan 2 #include <iostream> #include <string> #include <string.h> using namespace std; bool zmb[27][27]; bool vis[27][27]; int n; bool ispos; void dfs(char c) { if(ispos==true) return; if(c=='m') { ispos=true; return; } int i; for(i=0;i<26;++i) { if(vis[c-'a'][i]==1 || zmb[c-'a'][i]==0) continue; vis[c-'a'][i]=1; dfs(i+'a'); vis[c-'a'][i]=0; } return; } int main() { string str; int len; while(cin>>str) { if(str[0]=='0') { ispos=false; dfs('b'); if(ispos) cout<<"Yes."<<endl; else cout<<"No."<<endl; memset(vis,0,sizeof(vis)); memset(zmb,0,sizeof(zmb)); continue; } len=str.length(); if(str[len-1]==str[0]) continue; zmb[str[0]-'a'][str[len-1]-'a']=1; } return 0; }