赞
踩
有一位探险家找到了一座大小为n×m的钻石宝藏,他现在已经通过了仪器探明了这座宝藏中的宝藏分布
为了使收益最大化,探险家需要按以下规则来收获宝藏:
现在探险家想请你帮个忙,写一个程序帮他设计一条最优的路线,使探险家能够获取最大价值的宝藏。事成之后,他答应和你五五分成。
测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数 n 和 m ( 1≤n,m≤10 )。接下来n行,每行输入m个整数mi(0≤mi≤100)分别代表当前单元格中的宝藏价值。
输出探险家能够获得的最大宝藏价值。
- 3 3
- 0 6 0
- 5 8 7
- 0 9 0
24
- 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;
- }
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。