CubeIV

Given a matrix with each cell holds an integer number while all numbers are distinct. As for a cell with number i, you can go from here to adjoined cells with number i+1. The question is starting from which number we can go farest.

In fact we can put all these numbers from 1 to N in an one dimensional array and from the matrix we can decide if we can go from i to i + 1(We let next[i] = true if so). Then we use dynamic programming method and from the largest number N to 1 we record the longest steps we can go from i in . So we have:

import java.io.*;
import java.util.*;

public class CubeIV {
static private int[][] M = new int[1010][1010];
static private boolean[] next = new boolean[1010 * 1010];
static private int[] dp = new int[1010 * 1010];
static private int[] dx = {-1, 0, 1, 0};
static private int[] dy = {0, 1, 0, -1};
private static String solve(int N) {
for (int i = 1; i <= N * N; i++) {
next[i] = false;
dp[i] = 1;
}

for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int cur = M[i][j];
for (int k = 0; k < 4; k++) {
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < N && y >= 0 && y < N && M[x][y] == cur + 1) {
next[cur] = true;
break;
}
}
}
}
int max = 1;
int pos = 1;
for (int i = N * N; i >= 1; i--) {
if (next[i]) dp[i] += dp[i + 1];
if (max <= dp[i]) {
max = dp[i];
pos = i;
}
}
return String.format("%d %d", pos, max);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for (int t = 0; t < T; t++) {
int N = in.nextInt();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
M[i][j] = in.nextInt();
}
}
System.out.printf("Case #%d: %s\n", t + 1, solve(N));
}
}
}