其他分享
首页 > 其他分享> > 洛谷 P2196 [NOIP1996 提高组] 挖地雷

洛谷 P2196 [NOIP1996 提高组] 挖地雷

作者:互联网

 

 

 思路:dfs.

#include<iostream>
using namespace std;
int a[25],f[25];
int w[25][25];//记录两地窖间是否连通 
int b[25],p[25];//p和f数组用来记录路径 
int cnt,maxn;
int n;

bool check(int x)
{
	for(int i=1;i<=n;i++)
	{
		if(w[x][i]&&!b[i])return false;
	}
	return true;
}

void dfs(int x,int step,int y)
{
	if(check(x))//判断是否还能继续往下走,如果可以,记录一下最大值以及目前已经走了的路径,不可以则返回 
	{
		if(maxn<y)
		{
			maxn=y;
			cnt=step;
			for(int i=1;i<=step;i++)
			{
				f[i]=p[i];
			}
		}
		return;
	}
	
	for(int i=1;i<=n;i++)
	{
		if(w[x][i]&&!b[i])
		{
			b[i]=1;
			p[step+1]=i;
			dfs(i,step+1,a[i]+y);
			b[i]=0;//回溯 
		}
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			cin>>w[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		b[i]=1;
		p[1]=i;
		dfs(i,1,a[i]);
		b[i]=0;
	}
	for(int i=1;i<=cnt;i++)
	{
		cout<<f[i]<<" ";
	}
	cout<<endl<<maxn<<endl;
	return 0;
}

标签:25,挖地雷,洛谷,记录,int,NOIP1996,check
来源: https://blog.csdn.net/Y12309/article/details/120296420