由于数据量其实很小,直接DFS即可,细节见注释
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool vis[21];
int adj[21][3],cnt,tpath[20],start;
void dfs(int k,int level)
{
if(level==19)
{
for(int i=0;i<3;i++)
if(adj[k][i]==start)
{
//如果终点与起点相邻,那么这条路径满足条件,直接打印出来
tpath[level]=k;
printf("%d: ",cnt);
for(int j=0;j<20;j++) printf("%d ",tpath[j]);
printf("%d\n",start);
cnt++;
}
return;
}
vis[k]=1;
tpath[level]=k;
for(int i=0;i<3;i++)
if(!vis[adj[k][i]])
dfs(adj[k][i],level+1);
vis[k]=0;
//注意在这里要把vis[k]设置为0,因为一个点会出现在多条路径上,如果不设为0它就只
//出现在一条路径,后续过程无法访问到它
}
int main()
{
for(int i=1;i<=20;i++)
{
for(int j=0;j<3;j++) scanf("%d",&adj[i][j]);
sort(adj[i],adj[i]+3);
//对每个顶点的三个邻接点排序,这样DFS产生路径的顺序自然就是字典序
}
while(scanf("%d",&start)&&start)
{
memset(vis+1,0,sizeof(bool)*20);
cnt=1;
dfs(start,0);
}
return 0;
}