本文章纯属为了记录自己的萌新acm之路 请高手勿喷 有错误可指出感谢
题意就是 告诉你哪些城市是相连的 循环输入一个数代表开始的城市 让你输出从开始城市所有城市都走一遍回到开始城市的路径 有点像你出去旅游 规划好去哪里玩
然后想在想怎么能都走一遍
这个dfs应该不难看出 只不过这题需要数组存下走过的城市 然后发现能走后打印下路径就好了
废话不多说上代码 这里我写了两个ac代码 思路有一点点 不一样不过差别不大
代码有注释详解 有不懂或不对 评论区指出谢谢
第一种
这个代码的dfs 是正常比较好想的 就先想出递归过程的终止条件
#include<bits/stdc++.h>
using namespace std;
int ch[25][5];
int b[25],c[25];
int p,temp;
int a,m;
void dfs(int x,int temp){
c[temp]=x;
b[x]=1;
if(x==p&&temp==21){//等于p为找到 temp等于20为回到m
cout<<++a<<":"<<" ";//输出格式
for(int i=1;i<21;i++)
cout<<c[i]<<" ";
cout<<p<<endl;
return ;
}
for(int i=1;i<4;i++){//查找x城与哪个城相连
if(b[ch[x][i]]==0||(temp==20&&ch[x][i]==p)){//判断ch[x][i]城是否已经走过了
b[ch[x][i]]=1;
dfs(ch[x][i],temp+1);//以ch[x][i]为起点 步数+1
}
}
b[x]=0;//回溯
return ;
}
int main(){
for(int i=1;i<21;i++)
for(int j=1;j<4;j++)
cin>>ch[i][j];
while(cin>>p){
temp=0;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
if(p==0)
return 0;
dfs(p,1);
}
return 0;
}
这个第二个代码 就比上面少了一次递归 不过大体思路差不多
#include<bits/stdc++.h>
using namespace std;
int ch[25][5];
int b[25],c[25];
int p,temp;
int a;
void dfs(int x,int temp){
c[temp]=x;//存走的路径
b[x]=1;//表示已到x 不能重复走所以标记下
for(int i=1;i<4;i++){//查找x城与哪个城相连
if(ch[x][i]==p&&temp==20){//等于p为找到 temp等于20为回到m
cout<<++a<<":"<<" ";//输出格式
for(int i=1;i<21;i++)
cout<<c[i]<<" ";
cout<<p<<endl;
}
if(b[ch[x][i]]==0){//判断x与ch[x][i]城是否相连
dfs(ch[x][i],temp+1);//以ch[x][i]为起点 步数+1
}
}
b[x]=0;//回溯
return ;
}
int main(){
for(int i=1;i<21;i++)
for(int j=1;j<4;j++)
cin>>ch[i][j];
while(cin>>p){
temp=0;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
if(p==0)
return 0;
dfs(p,1);
}
return 0;
}