1 package noj_skiing; 2 3 import java.util.*; 4 import java.math.*; 5 6 public class Main { 7 8 public static void main(String[] args) { 9 Solution s = new Solution();10 Scanner sc = new Scanner(System.in);11 int N = sc.nextInt();12 int[] result = new int[N];13 for(int i = 0; i < N; i++) {14 int rowNum = sc.nextInt(); 15 int colNum = sc.nextInt();16 int[][] info = new int[rowNum][colNum];17 for(int r = 0; r < rowNum; r++) {18 for(int c = 0; c < colNum; c++) {19 info[r][c] = sc.nextInt();20 } 21 }22 result[i] = s.getResult(info, rowNum, colNum);23 }24 sc.close();25 for(int i : result) {26 System.out.println(i);27 }28 }29 30 }31 class Solution {32 public int getResult(int[][] info, int rowNum, int colNum) {33 int max = 0;34 int[][] states = new int[rowNum][colNum]; //make sure equal 0 all35 for(int r = 0; r < rowNum; r++) {36 for(int c = 0; c < colNum; c++) {37 max = Math.max(max, getMaxLength(info, r, c, rowNum, colNum, states));38 } 39 }40 return max;41 }42 public int getMaxLength(int[][] info, int row, int col, int rowNum, int colNum, int[][] states) {43 44 if(row < 0 || row >= rowNum || col < 0 || col >= colNum) //如果输入的坐标越界的处理45 return 0;46 if(states[row][col] != 0) //所求位置的最大长度求过47 return states[row][col];48 49 int nextStep = findNextStep(info, row, col, rowNum, colNum);50 if(nextStep == 0) //所求位置在队尾51 return states[row][col] = 1;52 int maxLengthUp = (nextStep & 8) == 8 ? getMaxLength(info, row - 1, col, rowNum, colNum, states) : 0;53 int maxLengthDown = (nextStep & 4) == 4 ? getMaxLength(info, row + 1, col, rowNum, colNum, states) : 0;54 int maxLengthLeft = (nextStep & 2) == 2 ? getMaxLength(info, row, col - 1, rowNum, colNum, states) : 0;55 int maxLengthRight = (nextStep & 1) == 1 ? getMaxLength(info, row, col + 1, rowNum, colNum, states) : 0;56 57 return max_4(maxLengthUp, maxLengthDown, maxLengthLeft, maxLengthRight) + 1;58 }59 public int findNextStep(int[][] info, int row, int col, int rowNum, int colNum) {60 int result = 0;61 62 if(row != 0 && info[row - 1][col] < info[row][col]) //up63 result |= 8;64 if(row != rowNum - 1 && info[row + 1][col] < info[row][col]) //down65 result |= 4;66 if(col != 0 && info[row][col - 1] < info[row][col]) //left67 result |= 2;68 if(col != colNum - 1 && info[row][col + 1] < info[row][col]) //right69 result |= 1;70 71 return result;72 }73 public int max_4(int i_1, int i_2, int i_3, int i_4) {74 return Math.max(Math.max(i_1, i_2), Math.max(i_3, i_4));75 }76 }
感觉不是很难,思路一上来就可以想出来,具体一些细节的处理也没有很坑的地方。