题意:
一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
解析:
dfs就好了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 20 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
vector<int> g[maxn];
int path[maxn];
bool vis[maxn];
int m;
int cnt;
void dfs(int fr, int dep)
{
if (dep > 22)
return;
if (fr == m && dep == 20)
{
printf("%d: ", cnt++);
printf(" %d", m);
for (int i = 0; i < 20; i++)
{
printf(" %d", path[i]);
}
printf("\n");
return ;
}
for (int i = 0; i < g[fr].size(); i++)
{
int to = g[fr][i];
if (!vis[to])
{
path[dep] = to;
vis[to] = true;
dfs(to, dep + 1);
vis[to] = false;
}
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
for (int i = 1; i <= 20; i++)
{
for (int j = 1; j <= 3; j++)
{
int x;
scanf("%d", &x);
g[i].push_back(x);
}
}
while (~scanf("%d", &m) && m)
{
memset(vis, false, sizeof(vis));
cnt = 1;
dfs(m, 0);
}
return 0;
}