Description
给你一个大小为m*n的矩阵Mine表示矿场,里面有丰富的宝石。Mine(i,j)若大于0,表示该点存在宝石,其值为宝石价值;若等于0,表示的是不可进入的区域;若小于-1表示危险区域。当你选择一个点挖宝石的时候,你可以把相邻(上下左右)的宝石也挖出来。但是注意,任意你挖出宝石的点不可与危险区域相邻。
请计算你从某一点作为起点能挖出的最大财富,财富等于你挖出宝石价值的总和。
Input
第一行给出m和n,第二行给出Mine的一维表示
1<=m,n<=50
-1<=Mine[i][j]<=10
Output
整数最大价值
Sample Input 1
3 3
1 0 0 4 0 1 2 3 1
Sample Output 1
12
Sample Input 2
3 3
0 1 0 1 1 1 0 1 0
Sample Output 2
5
Sample Input 3
2 3
1 2 3 4 -1 5
Sample Output 3
3
#include<iostream>
using namespace std;
int Mine[51][51];
int maxn=0;
int m,n;
bool vv[51][51]={false};
int DFS(int a,int b){
int max=0;
vv[a][b]=true;
max+=Mine[a][b];
for(int i=0;i<4;i++){
if(b+1<=n-1&&Mine[a][b+1]!=0&&vv[a][b+1]==false)
{
max+=DFS(a,b+1);
}
if(a+1<=m-1&&Mine[a+1][b]!=0&&vv[a+1][b]==false){
max+=DFS(a+1,b);
}
if(b-1>=0&&Mine[a][b-1]!=0&&vv[a][b-1]==false){
max+=DFS(a,b-1);
}
if(a-1>=0&&Mine[a-1][b]!=0&&vv[a-1][b]==false){
max+=DFS(a-1,b);
}
}
return max;
}
int main(){
cin>>m>>n;
//cout<<"dsal";
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
cin>>Mine[i][j];
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(Mine[i][j]<0){
Mine[i][j]=0;
if(i==0&&j==0)
{
Mine[i][j+1]=0;
Mine[i+1][j]=0;
}
else if(i==0){
Mine[i][j-1]=0;
Mine[i][j+1]=0;
Mine[i+1][j]=0;
}
else if(j==0){
Mine[i-1][j]=0;
Mine[i+1][j]=0;
Mine[i][j+1]=0;
}
else{
Mine[i-1][j]=0;
Mine[i+1][j]=0;
Mine[i][j-1]=0;
Mine[i][j+1]=0;
}
}
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(Mine[i][j]>0){
int temp=DFS(i,j);
if(maxn<temp){
maxn=temp;
}
}
}
cout<<maxn;
return 0;
}