本文主要是介绍HDOJnbsp;nbsp;2181nbsp;nbsp;nbsp;哈密顿绕行世界问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2181
有两种代码,感觉都挺好的
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 23;
bool visit[MAXN];
int n,g,p[MAXN][3],pas[MAXN];
void dfs(int c,int cnt){
if(cnt==20&&(p[c][0]==n||p[c][1]==n||p[c][2]==n))
{
cout<<g++<<": ";
for(int i=0;i<20;i++)
cout<<pas[i]<<' ';
cout<<n<<endl;
}
for(int i=0;i<3;i++)
{
int po=p[c][i];
if(!visit[po])
{
pas[cnt]=po;
visit[po]=true;
dfs(po,cnt+1);
visit[po]=false;
}
}
}
int main(){
for(int i=1;i<=20;i++)
cin>>p[i][0]>>p[i][1]>>p[i][2];
while(cin>>n,n){
memset(visit,false,sizeof(visit));
g=1;
visit[n]=true;
pas[0]=n;
dfs(n,1);
}
return 0;
}
还有一种用数组的:
#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int map[22][22];
int path[22];//保存路径
int s,num;//始点和路线号
bool visited[22];
void dfs(int v,int cnt){
if(cnt==19 && map[v][s] )
{
printf("%d: ",++num);
for(int i=0;i<20;i++)
printf("%d ",path[i]);
printf("%d\n",s);
return ;
}
if(cnt>19)
return ;
for( int i=1;i<=20;i++)
if(!visited[i] && map[v][i] )
{
path[cnt+1]=i;
visited[i]=1;
dfs(i,cnt+1);
visited[i]=0; //回溯
// if(cnt>=19) return ;
}
}
int main(){
int v,a,b,c;
memset(map,0,sizeof(map));
for(int i=1;i<=20;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[i][a]=map[i][b]=map[i][c]=1;
map[a][i]=map[b][i]=map[c][i]=1; //双向的
}
while(scanf("%d",&v)!=EOF && v)
{
memset(visited,0,sizeof(visited));
s=v;
num=0;
visited[v]=1;
path[0]=v;