在网格中查找最大点,以便始终覆盖特定点
题
杰夫喜欢玩游戏,贪吃蛇(诺基亚时代的老游戏)是他的最爱之一。 然而,在玩过饕s蛇多次后,他终于厌倦了原来的规则。
为了给这款老游戏带来新的挑战,杰夫推出了新的规则:
特别案例 :
一个。 即使在左边界和右边界,蛇也可以上下移动。
湾 当蛇位于一列的顶部单元格时,它仍然可以上升,这要求玩家支付所有当前点数,然后蛇将被传送到该列的底部单元格,反之亦然。
创建这样一款新游戏后,杰夫很困惑如何获得最高分。 请帮他写一个程序来解决这个问题。
输入第一行包含两个整数n(行)和m(列),(1 <= n,m <= 500),由一个空格分隔。
接下来n行描述网格。 每行包含m个整数vi(-1≤vi≤99999)vi = -1表示单元格被阻塞。
产量
输出您可以获得的最高分数。 如果蛇不能到达右侧,则输出-1。
范围
•每次测试的内存限制:256兆字节
•每次测试的时间限制:编译速度越快越好
4 4
-1 4 5 1
2 -1 2 4
3 3 -1 3
4 2 1 2
我已经用下面给出的代码解决了问题,然后面试官改变了问题,并要求现在蛇总是需要在其路径中采取特定的点,包括该特定点只有当点是(2,1)那么它必须总是在其路径上取3。 比我们必须找到最大的总和? 我无法在面试中做到这一点,请任何人帮助它,只是在这类问题完成后才提供链接。 我应用dfs面试官告诉dfs在这个问题上是错误的,我无法弄清楚它为什么是错误的以及有什么可以更好的算法来找到答案
码
import java.util.Scanner;
public class worksApplication {
private static int rows;
private static int col;
private static int[][] a;
private static boolean[][] check;
private static int max1;
private static int max;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
rows = sc.nextInt();
col = sc.nextInt();
a = new int[rows][col + 1];
check = new boolean[rows][col];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < col + 1; j++) {
if (j == col) {
a[i][j] = -1;
} else
a[i][j] = sc.nextInt();
}
}
for (int i = 0; i < rows; i++) {
if (a[i][0] != -1) {
check[i][0] = true;
solve(i, 0, a[i][0]);
check[i][0] = false;
max1 = Math.max(max, max1);
}
}
System.out.println(max1);
}
private static void solve(int i, int j, int sum) {
// TODO Auto-generated method stub
if (i - 1 == -1 && check[rows - 1][j] == false && a[rows - 1][j] != -1) {
check[rows - 1][j] = true;
solve(rows - 1, j, a[rows - 1][j]);
check[rows - 1][j] = false;
}
if (i - 1 >= 0 && check[i - 1][j] == false && a[i - 1][j] != -1) {
check[i - 1][j] = true;
solve(i - 1, j, sum + a[i - 1][j]);
check[i - 1][j] = false;
}
if (a[i][j + 1] != -1 && check[i][j + 1] == false) {
check[i][j + 1] = true;
solve(i, j + 1, sum + a[i][j + 1]);
check[i][j + 1] = false;
}
if (i + 1 == rows && a[0][j] != -1 && check[0][j] == false) {
check[0][j] = true;
solve(0, j, a[0][j]);
check[0][j] = false;
}
if (i + 1 < rows && a[i + 1][j] != -1 && check[i + 1][j] == false) {
check[i + 1][j] = true;
solve(i + 1, j, sum + a[i + 1][j]);
check[i + 1][j] = false;
}
if (max < sum) {
max = sum;
}
}
}
链接地址: http://www.djcxy.com/p/63845.html
上一篇: Find max points in grid such that a particular point is always covered
下一篇: Find the maximum sum path of a matrix from left column to right column?