探险家(深搜)

文章讲述了探险家在给定的n×m网格中寻找最大宝藏价值的问题,利用深度优先搜索策略规划最优路线。输入包含单元格宝藏值,输出为目标区域内的最大宝藏总和。
摘要由CSDN通过智能技术生成
题目描述

有一位探险家找到了一座大小为n×m的钻石宝藏,他现在已经通过了仪器探明了这座宝藏中的宝藏分布

为了使收益最大化,探险家需要按以下规则来收获宝藏:

  • 每当探险家进入一个单元,就会收集该单元格中的所有宝藏。
  • 探险家每次可以从当前位置向上下左右四个方向走。
  • 每个单元格只能被进入一次。
  • 不得进入宝藏数目为 0 的单元格。
  • 矿工可以从网格中 任意一个 有宝藏的单元格出发或者是停止。

现在探险家想请你帮个忙,写一个程序帮他设计一条最优的路线,使探险家能够获取最大价值的宝藏。事成之后,他答应和你五五分成。

输入描述

测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数 n 和 m ( 1≤n,m≤10 )。接下来n行,每行输入m个整数mi​(0≤mi​≤100)分别代表当前单元格中的宝藏价值。

输出描述

输出探险家能够获得的最大宝藏价值。

测试样例1
输入
3 3
0 6 0
5 8 7
0 9 0
输出
24
测试样例2
输入
5 3
1 0 7
2 0 6
3 4 5
0 3 0
9 0 20
输出
28
提示

对于第一组测试样例:一种收集最多黄金的路线是:9−>8−>7。
对于第二组测试样例:一种收集最多黄金的路线是:1−>2−>3−>4−>5−>6−>7。

​
#include<bits/stdc++.h>
using namespace std;
int s[1010][1010];
int vis[1010][1010];
int sum=0;
int n,m;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y,int ans){
	for(int i=0;i<4;i++){
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];
		if(tx>=0 &&ty>=0 &&tx<n &&ty<m &&s[tx][ty]!=0 &&vis[tx][ty]==0){
			vis[tx][ty]=1;
			dfs(tx,ty,ans+s[tx][ty]);
			vis[tx][ty]=0;
		}		
	}
	sum=max(ans,sum);
return;
}
int main(){
	while(cin>>n>>m){
		sum=0;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>s[i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(s[i][j]!=0){
					vis[i][j]=1;
					dfs(i,j,s[i][j]);	
					vis[i][j]=0;
				}
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值