用一个map数组记录每一个城市相邻的三个城市,用一个vis记住是否访问过这个城市,接下来就是dfs。路径是用re数组记住的。如果这个城市没有访问过,那么就用re数组记住他,再把他标记已经去过了,接下来进行下一步的搜索。如果碰到了访问过得城市,那就跳过他了呗,继续搜索。如果第一个分支搜完了, 就不要打扰第二个分支的搜索,这时候需要回溯一下。当搜索完20个城市,第21个城市的时候,就输出。
#include<stdio.h>
int vis[21] = { 0 };
int map[21][3];
int flag;
int m;
int re[21];
void DFS(int x, int step)
{
if (step == 21 && x == m)//满足21个城市,并且最后回到原城市。
{
printf_s("%d: ", flag);//每个输出的flag后面有两个空格。
for (int i = 0; i < 21; i++)
{
printf(" %d", re[i]);
}
printf_s("\n");
flag++;
return;
}
for (int i = 0; i < 3; i++)//找每个城市连接的三个城市。
{
if (!vis[map[x][i]])
{
re[step] = map[x][i];
vis[map[x][i]] = 1;
DFS(map[x][i], step + 1);//深搜。
vis[map[x][i]] = 0;//回溯。
}
}
return;
}
int main()
{
for (int i = 1; i < 21; i++)
for (int j = 0; j < 3; j++)
{
scanf_s("%d", &map[i][j]);
}
while (scanf_s("%d", &m) != EOF)
{
flag = 1;
if (m == 0)
break;
re[0] = m;
DFS(m, 1);
}
return 0;
}