题意是granny是否能从家里出发,走完每一个点仅一次然后回到家,也就是找是否存在汉密尔顿回路。数据规模小,我的方法是用二维数组保存连接点,然后DFS搜索。 #include<iostream> using namespace std; const int Max=10; bool mat[Max][Max]; int n,cnt,num=1; bool flag,vis[Max]; void DFS(int i) { if(cnt==n) //若访问完全部的点且该点与0点连通,则返回TRUE { if(mat[i][0]==true) { flag=true; return; } } int j; for(j=1;j<=n;j++) { if(mat[i][j]==true && vis[j]==false) //若i点与j点连通且j点未被访问,则进入j点进行下一个搜索 { vis[j]=true; cnt++; DFS(j); vis[j]=false; //回溯 cnt--; } } } bool run() { scanf("%d",&n); getchar(); if(n==0) return false; int i,j; for(i=0;i<=n;i++) //初始化 { for(j=0;j<=n;j++) mat[i][j]=false; } for(i=0;i<=n;i++) vis[i]=false; for(i=1;i<=n;i++) { char pos; while(true) { scanf("%c",&pos); if(pos=='/n') break; //处理到回车为止 if(pos>='0' && pos<='9') { mat[i][pos-'0']=true; //表示双向连通 mat[pos-'0'][i]=true; } } } cnt=0; //初始化 flag=false; vis[0]=true; DFS(0); //搜索 printf("Case %d: ",num++); if(flag==true) printf("Granny can make the circuit./n"); else printf("Granny can not make the circuit./n"); return true; } int main() { while(run()); return 0; }