当前位置:   article > 正文

探险家(深搜)

探险家(深搜)
题目描述

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

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

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

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

输入描述

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

输出描述

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int s[1010][1010];
  4. int vis[1010][1010];
  5. int sum=0;
  6. int n,m;
  7. int dir[4][2]={0,1,1,0,0,-1,-1,0};
  8. void dfs(int x,int y,int ans){
  9. for(int i=0;i<4;i++){
  10. int tx=x+dir[i][0];
  11. int ty=y+dir[i][1];
  12. if(tx>=0 &&ty>=0 &&tx<n &&ty<m &&s[tx][ty]!=0 &&vis[tx][ty]==0){
  13. vis[tx][ty]=1;
  14. dfs(tx,ty,ans+s[tx][ty]);
  15. vis[tx][ty]=0;
  16. }
  17. }
  18. sum=max(ans,sum);
  19. return;
  20. }
  21. int main(){
  22. while(cin>>n>>m){
  23. sum=0;
  24. memset(vis,0,sizeof(vis));
  25. for(int i=0;i<n;i++){
  26. for(int j=0;j<m;j++){
  27. cin>>s[i][j];
  28. }
  29. }
  30. for(int i=0;i<n;i++){
  31. for(int j=0;j<m;j++){
  32. if(s[i][j]!=0){
  33. vis[i][j]=1;
  34. dfs(i,j,s[i][j]);
  35. vis[i][j]=0;
  36. }
  37. }
  38. }
  39. cout<<sum<<endl;
  40. }
  41. return 0;
  42. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/714493
推荐阅读
相关标签
  

闽ICP备14008679号