正十二面體 20 頂點對應 20 城市,每頂點度為 3。給定鄰接表,從城市 m 出發,經過每城市恰好一次回到 m,輸出所有路徑(字典序)。
標準 DFS 回溯:
o、已走步數 n、起點 q。#include
#include
using namespace std;
int mat[25][3], a[25], vis[25], m, cnt;
void dfs(int o, int n, int q) {
a[n] = o; vis[o] = 1;
for (int i = 0; i < 3; ++i) {
int s = mat[o][i];
if (n == 19 && s == q) {
printf("%d: ", ++cnt);
for (int j = 0; j < 20; ++j) printf("%d ", a[j]);
printf("%d\n", m);
}
if (!vis[s]) dfs(s, n+1, q);
}
vis[o] = 0;
}
int main() {
for (int i = 1; i <= 20; ++i) scanf("%d%d%d", &mat[i][0], &mat[i][1], &mat[i][2]);
while (scanf("%d", &m) && m) {
cnt = 0; memset(vis, 0, sizeof(vis));
dfs(m, 0, m);
}
return 0;
}