思路:题目是让我们求一条能挖到地雷数量最多的路径,并且数据比较小(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;
}
代码是抄的洛谷一个大佬的,注释和思路都是我自己敲得,如果对你有帮助,记得给我个赞噢~