【题意】中文题面。
【分析&解题思路】简单回溯,排序之后回溯。
【AC代码】
#include <set>
#include <map>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int>G[21];
int v[3];
bool vis[21];
int ans[21];
int cnt;
void print_path(){
printf("%d: ",++cnt);
for(int i=0; i<20; i++) printf("%d ",ans[i]);
printf("%d\n",ans[20]);
}
void dfs(int u,int fa,int step){
for(int i=0; i<G[u].size(); i++){
int v=G[u][i];
if(v==fa){
if(step<20) continue;
ans[step] = fa;
print_path();
return ;
}
if(vis[v]) continue;
vis[v] = true;
ans[step] = v;
dfs(v,fa,step+1);
vis[v]=false;
}
}
int main(){
for(int i=1;i<=20;i++){
for(int j=0; j<3; j++){
scanf("%d",&v[j]);
G[i].push_back(v[j]);
}
}
int m;
while(scanf("%d",&m)){
if(m==0) break;
cnt = 0;
memset(vis,false,sizeof(vis));
ans[0]=m;
vis[m]=true;
dfs(m,m,1);
}
return 0;
}