Introduction
给你一个大小为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
3 3
0 1 0 1 1 1 0 1 0
output
5
Solution
import java.util.Scanner;
public class Main {
static void dfs(int x,int y){
if(x<0||x>n-1||y<0||y>m-1||flag[x][y])return;
score+=arr[x][y];
if(score>max)max=score;
flag[x][y]=true;
for(int k=0;k<4;k++){
dfs(x+X[k],y+Y[k]);
}
}
static int n,m,max=0,score=0;
static int[][] arr;
static boolean[][] flag;
static int[] X={1,0,-1,0};
static int[] Y={0,1,0,-1};
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
n=s.nextInt();
m=s.nextInt();
arr=new int[n][m];
flag =new boolean[n][m];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
arr[i][j]=s.nextInt();
}
}
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if(arr[i][j]==0)flag[i][j]=true;
if(arr[i][j]==-1){
flag[i][j]=true;
for(int k=0;k<4;k++){
if(i+X[k]>=0&&i+X[k]<n&&j+Y[k]>=0&&j+Y[k]<m)
flag[i+X[k]][j+Y[k]]=true;
}
}
}
}
// for (boolean[] a:flag){
// System.out.println(Arrays.toString(a));
// }
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
score=0;
dfs(i,j);
}
}
System.out.println(max);
}
}
Experience
一次普通的dfs,刚开始忘记了score=0