前20行的第i行有3个数,表示与第i个城市相邻的3个城市,第20行后每行有一个数m,求从m出发经过每个城市一次又回到m的所有路线。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<vector>
using namespace std;
#define maxn 50
int map[maxn][maxn];
int vis[maxn],a[maxn];
int m,k;
void dfs(int start,int cur)
{
if(cur==21&&map[start][m])//如果满足条件则输出
{
printf("%d: ",++k);
for(int i=1;i<=20;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[1]);
}
else//如果不满足条件则继续搜
{
for(int i=1;i<=20;i++)
{
if(map[start][i]&&vis[i]==0)
{
a[cur]=i;
vis[i]=1;//标记
dfs(i,cur+1);//递归
vis[i]=0;//回溯
}
}
}
}
int main()
{
int i,j,a1,b1,c1;
k=0;
memset(map,0,sizeof(map));
for(int i=1;i<=20;i++)
{
scanf("%d%d%d",&a1,&b1,&c1);
map[i][a1] = 1;
map[i][b1] = 1;
map[i][c1] = 1;
}
while(scanf("%d",&m)!=EOF)
{
if(m==0) break;
memset(vis,0,sizeof(vis));
a[1]=m;
vis[m]=1;
dfs(m,2);
}
return 0;
}