挖地雷(爆搜思路)

在这里插入图片描述
思路:题目是让我们求一条能挖到地雷数量最多的路径,并且数据比较小(N<=20),我们可以使用爆搜来解决,我们先将n-1个地窖能通向哪个地窖用二维数组存储起来,然后我们从第一个地窖开始搜索,一直搜索到第n个地窖,每次先标记改地窖为已访问,然后将当前地窖的地雷数量传进dfs中,我们进入dfs也是继续进行搜索,枚举哪一条路能够走并且未被访问过,我们就进入搜索,然后用一个check函数来判断当前路径已经没有地窖可走了并且所有的地窖都标记过了我们就判断当前路径的地雷数量是不是大于我们已记录的最大的地雷数量,如果大于我们就将path里记录的路径信息赋值给ans数组,最后我们所有可能的路经都搜索完了之后输出我们记录的最大值和他所要走的地窖路径即可

上代码:

#include<bits/stdc++.h>
using namespace std;
bool f[21][21];
int a[21];
int path[21],ans[21],cnt;
bool b[21];
int n,maxx;

bool check(int x){
	for(int i=1;i<=n;i++){ //如果他还有没访问的地窖或者当前地窖还能通往别的地窖我们就不让他结束 
		if(f[x][i]&&!b[i])return false;
	}
	return true; //否则就没得挖了 
}

void dfs(int x,int step,int sum){
	if(check(x)){
		if(maxx<sum){ //如果没得挖了就判断这次挖地雷的数量是不是大于历史记录的数量 
			maxx=sum; //大于的话将挖到的地雷数量和经过的地窖数量记录起来 
			cnt=step;
			for(int i=1;i<=step;i++)ans[i]=path[i]; //并且将路径赋值 
		}
        return;
	}
	for(int i=1;i<=n;i++){
		if(f[x][i]&&!b[i]){ //进来之后还是搜索,如果当前地窖可以通往改地窖并且改地窖还没被访问我们就进去 
			b[i]=1; //标记 
			path[step+1]=i; //记录路径 
			dfs(i,step+1,sum+a[i]); //加上该地窖能挖到的地雷数量,并且地窖数加1 
			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>>f[i][j]; //第i个地窖可以通往第j个地窖	
	for(int i=1;i<=n;i++){ //每一个地窖作为起始点开始搜索 
	    b[i]=1; //设置为已访问 
		path[1]=i; //记录路径 
    	dfs(i,1,a[i]); //进行搜索,传递的参数为当前的地窖编号和当前地窖能挖到的地雷总数 
    	b[i]=0; //搜索玩记得取消标记 
	} 
	for(int i=1;i<=cnt;i++)
	cout<<ans[i]<<" "; //全搜完了我们就输出一条挖出地雷最大的路径 
	cout<<endl<<maxx;//并输出他能挖到的地雷数量 
	return 0;
}

代码是抄的洛谷一个大佬的,注释和思路都是我自己敲得,如果对你有帮助,记得给我个赞噢~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这咋又bug了嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值