HDU-2181哈密顿绕行世界(DFS)

链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2181

题解:
用一个二维数组 way[i][3] 保存i点能到达所有 地方,然后在DFS的扩展地方就去遍历 后面那个3就好了

代码:

#include<iostream>
using namespace std;
int way[22][5];//保存路径 
int vis[22];//标记数组
int path[100];//记录路径
int m,k;

void DFS(int now_city,int cnt)
{//now_city为当前的城市,cnt为第几步到达
	path[cnt]=now_city;//记录路径

	if(cnt==21&&now_city == m)
	{//结束条件
		cout<<k++<<":  ";
		for(int i=1;i<21;i++)
		{
			cout<<path[i]<<" ";
		}
		cout<<path[21]<<endl;
		return ;
	}
	for(int i=0;i<3;i++)
	{//遍历所有可能
		int next_city = way[now_city][i];//寻找下一个顶点
		if(cnt == 20 && next_city == m)
		{//特判第21个点是否是m
			DFS(m,21);
		}
		if(!vis[next_city])
		{//如果下一个城市没被访问过
			vis[next_city] = 1;
			DFS(next_city,cnt+1);
			vis[next_city] = 0;
		}
	}
}

int main()
{
	for(int i=1;i<=20;i++)
	{
		cin>>way[i][0]>>way[i][1]>>way[i][2];
	}		
	while(cin>>m)
	{
		if(m==0)
			break;
		k=1;
		vis[m] = 1;
		DFS(m,1);
	}
	return 0;
}

发布了67 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_26235879/article/details/103001891