#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define MAXNUM 10 int dlen[MAXNUM][MAXNUM]; unsigned int a[MAXNUM][MAXNUM]; unsigned int row; unsigned int column; int len(const int i, const int j) { // 形参是坐标,返回的是以a[i][j]为末元素的最长递增子序列的长度 if(!( 1 <= i && i <= row && 1 <= j && j <= column )) { // cout << "Error!" << ' ' << i << ' ' << j << endl; return 0; } if(dlen[i][j] != -1) return dlen[i][j]; if (dlen[i][j - 1] == -1) dlen[i][j - 1] = len(i, j - 1); if (dlen[i + 1][j] == -1) dlen[i + 1][j] = len(i + 1, j); if (dlen[i][j + 1] == -1) dlen[i][j + 1] = len(i, j + 1); if (dlen[i - 1][j] == -1) dlen[i - 1][j] = len(i - 1, j); int temp = 0; // 比中间值小的所有len中最大的 if (a[i][j] > a[i-1][j] && dlen[i-1][j] > temp) // dlen >= 1 temp = dlen[i-1][j]; if (a[i][j] > a[i+1][j] && dlen[i+1][j] > temp) temp = dlen[i+1][j]; if (a[i][j] > a[i][j-1] && dlen[i][j-1] > temp) temp = dlen[i][j-1]; if (a[i][j] > a[i][j+1] && dlen[i][j+1] > temp) temp = dlen[i][j+1]; if(temp == 0) // a[i][j]是极小值 return 1; return temp + 1; } int SearchMax(void) { int max = dlen[1][1]; for(int i = 1; i <= row; i++) { for(int j = 1; j <= column; j++) if(max < dlen[i][j]) max = dlen[i][j]; } return max; } int main(void) { freopen("cin.txt", "r", stdin); int count; cin >> count; while(count--) { cin >> row >> column; memset(dlen, -1, sizeof(dlen)); // 很小 memset(a, 1, sizeof(a)); // 很大 for(int i = 1; i <= row; i++) { for(int j = 1; j <= column; j++) cin >> a[i][j]; } dlen[1][1] = len(1, 1); cout << SearchMax() << endl; } return 0; }