#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=30;
int g[N][5],m,cnt=0;
int vis[N],path[N];
void print()
{
printf("%d: ",cnt);
for(int i=1;i<=21;i++)
{
printf("%d",path[i]);
if(i==21)
printf("\n");
else
printf(" ");
}
}
void dfs(int cur,int num)
{
path[num]=cur;
if(num==21)
{
cnt++;
print();
return;
}
vis[cur]=1;
for(int k=1;k<=3;k++)
{
if((num!=20&&!vis[g[cur][k]])||(g[cur][k]==m&&num==20))
{
dfs(g[cur][k],num+1);
if(g[cur][k]!=m)//起点vis[m]不清0
vis[g[cur][k]]=0;//该点为cur的情况讨论完毕,回溯
}
}
}
int main()
{
for(int i=1;i<=20;i++)
{
for(int j=1;j<=3;j++)
{
scanf("%d",&g[i][j]);//g[i][j]和i相连的城市
}
}
while(cin>>m&&m)
{
cnt=0;
memset(vis,0,sizeof(vis));
vis[m]=1;
dfs(m,1);//从m出发&&回到m
}
return 0;
}
hdu 2181 哈密顿绕世界(dfs+回溯)
最新推荐文章于 2019-07-08 14:50:00 发布