思路:因为题目要字典序,我们一开始将每个国家地附近国家按字典序排好。剩下的就是深搜了,注意一下最后能不能回到原点就好了
吐槽:据说这题的数据都是排好序的
0ms代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int book[21],data[20][3],mark[21];
int m=1;
void dfs(int size,int x)
{
int i;
if(x==21 && (data[size-1][0]==mark[1]||data[size-1][1]==mark[1]||data[size-1][2]==mark[1]))
{
printf("%d: ",m);
for(i=1;i<=20;i++)
printf("%d ",mark[i]);
printf("%d\n",mark[1]);
m++;
return ;
}
for(i=0;i<3;i++)
{
if(!book[data[size-1][i]])
{
mark[x]=data[size-1][i];
book[mark[x]]=1;
dfs(mark[x],x+1);
book[mark[x]]=0;
mark[x]=0;
}
}
return ;
}
int main()
{
int i,j,k,temp,n;
for(i=0;i<20;i++)
for(j=0;j<3;j++)
scanf("%d",&data[i][j]);
for(i=0;i<20;i++)
{
j=3;
while(j--)
for(k=0;k<j;k++)
if(data[i][k]>data[i][k+1])
temp=data[i][k],data[i][k]=data[i][k+1],data[i][k+1]=temp; //把每个国家的附近国家按字典序排
}
while(~scanf("%d",&n) && n)
{
memset(book,0,sizeof(book));
mark[1]=n;
book[n]=1;
dfs(n,2);
}
return 0;
}