注意重置访问时的位置!
只有访问过的字母/数字才要变!
一眼明了版:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=10000;
struct Word{
char s,e;
int vis;
}word[N];
int flag=0,i;
void dfs(int d,char c,int n){
// cout<<d<<" "<<c<<" "<<n<<endl;
if(flag) return;
if(d==i){
return;
}
if(word[n].e=='m'){
flag=1;
return;
}
word[n].vis=1;
for(int j=1;j<=i;j++){
if(word[j].s==c&&!word[j].vis){
dfs(d+1,word[j].e,j);
word[j].vis=0;
}
}
}
int main(){
char s[N];
while(~scanf("%s",s)){
i=1;
word[1].s=s[0];
word[1].e=s[strlen(s)-1];
word[1].vis=0;
flag=0;
for(i=2;;i++){
scanf("%s",s);
if(s[0]=='0') break;
word[i].s=s[0];
word[i].e=s[strlen(s)-1];
word[i].vis=0;
}
for(int j=1;j<=i;j++){
if(flag) break;
if(word[j].s=='b') dfs(1,word[j].e,j);
}
flag?puts("Yes."):puts("No.");
}
}
/*
so
soon
river
goes
them
got
moon
begin
big
0
*/
整洁版:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=27;
int map[N][N];
char s[1000];
int flag=0;
void dfs(int m,int n){
if(flag) return;
if(n==12){
flag=1;
return;
}
map[m][n]=0;
for(int i=0;i<26;i++){
if(flag) break;
if(map[n][i]){
dfs(n,i);
map[n][i]=1;
}
}
}
int main(){
while(~scanf("%s",s)){
memset(map,0,sizeof(map));
flag=0;
map[s[0]-'a'][s[strlen(s)-1]-'a']=1;
while(~scanf("%s",s)){
if(s[0]=='0') break;
map[s[0]-'a'][s[strlen(s)-1]-'a']=1;
}
for(int i=0;i<26;i++){
if(flag) break;
if(map[1][i]) dfs(1,i);
}
flag?puts("Yes."):puts("No.");
}
}