题目地址
解题思路
使用dfs搜索一下就能过,对于需要字典序从小到大排序,我们可以预处理给出的边。将与第i个点相连的边按照从小到大的顺序排好。由于dfs时是从0到n的,这样就保证了字典序从小到大。
还有一点注意的是给定的m点在一开始就被标记了,当再次访问到它的时候step必须等于19才能访问。
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int vis[30], ans[30];
int m, num = 1;
vector <int> G[30];
void dfs(int v, int step)
{
if (step == 20 && v == m)
{
cout << num++ << ": ";
for (int i=0; i<20; i++)
{
cout << ans[i] << " ";
}
cout << m << endl;
return ;
}
else if (step == 20)
return ;
vis[v] = 1;
ans[step] = v;
for (int i=0; i<G[v].size(); i++)
{
if (!vis[G[v][i]] || (step == 19 && G[v][i] == m))
dfs(G[v][i], step + 1);
}
vis[v] = 0;
}
int main()
{
int x, y, z;
for (int i=1; i<=20; i++)
{
cin >> x >> y >> z;
G[i].push_back(x);
G[i].push_back(y);
G[i].push_back(z);
sort(G[i].begin(), G[i].end());
}
while (cin >> m && m)
{
num = 1;
memset(vis, 0, sizeof(vis));
dfs(m, 0);
}
return 0;
}