/* 题目:南航acm1077 思路:这个题目我很久以前见过,但当时不会,今天重新看了 一下,但做起来也不是那么的顺利,这个题是用DFS来 解决的,而且由于对于搜索过的点要用一个对应的数组 将已得结果存起来,避免重复求解(visited数组)。 提交情况:一次ac 收获:要考虑全面,学会对代码的静态检查。 */ #include <iostream> using namespace std; int row, col; int snow[100][100]; int visited[100][100]; int init(void) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) cin >> snow[i][j]; } memset(visited, 0, sizeof(int)*100*100); } void DFS(int x, int y) { int max = 0; if (x != 0 && snow[x][y] > snow[x-1][y]) { if (!visited[x-1][y]) DFS(x-1, y); if (visited[x-1][y] + 1 > max) max = visited[x-1][y] + 1; } if (x != row - 1 && snow[x][y] > snow[x+1][y]) { if (!visited[x+1][y]) DFS(x+1, y); if (visited[x+1][y] + 1 > max) max = visited[x+1][y] + 1; } if (y != 0 && snow[x][y] > snow[x][y-1]) { if (!visited[x][y-1]) DFS(x, y-1); if (visited[x][y-1] + 1 > max) max = visited[x][y-1] + 1; } if (y != col - 1 && snow[x][y] > snow[x][y+1]) { if (!visited[x][y+1]) DFS(x, y+1); if (visited[x][y+1] + 1 > max) max = visited[x][y+1] + 1; } visited[x][y] = max ? max : 1; } int Search(void) { int max = -1; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (!visited[i][j]) DFS(i, j); if (visited[i][j] > max) max = visited[i][j]; } } return max; } int main() { while (cin >> row >> col && row) { init(); cout << Search() << endl; } return 0; }