DFS 环绕城市

 用一个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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值