/*
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。
下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
*/
#include <iostream>
using namespace std;
//返回两个数中的相对大的值
int max(int a, int b)
{
return (a > b ? a : b);
}
/* 递归函数:以传递进来的点通过不停地上下左右寻路,寻一次就将step加1,表示找到一条路径
直到没有路可走(即上下左右的数值都比当前值大或已经到了界点),返回其
递归最深的那个数,也就是所谓的最长路径
*/
int run(int **pa, int r, int c, int curR, int curC, int step)
{
//将当前的路径步数保存到max_len变量
int max_len = step;
//按照上、右、下、左的顺序依次进行探路,每次将step加1,表示增加了一步
//如果当前行大于0,并上一行的数值小于当前数值,就向上走一步
if (0 < curR && pa[curR - 1][curC] < pa[curR][curC])
max_len = max(max_len, run(pa, r, c, curR - 1, curC, step + 1));
//如果当前列小于数组列数,并且后一列的数值小于当前列的数值,就向右走一步
if (curC < c - 1 && pa[curR][curC + 1] < pa[curR][curC])
max_len = max(max_len, run(pa, r, c, curR, curC + 1, step + 1));
//如果当前行小于数组行数,并且下一行的数值小于当前行的数值,就向下走一步
if (curR < r - 1 && pa[curR + 1][curC] < pa[curR][curC])
max_len = max(max_len, run(pa, r, c, curR + 1, curC, step + 1));
//如果当前列大于0,并且前面一列的数值小于当前列,就向左走一步
if (0 < curC && pa[curR][curC - 1] < pa[curR][curC])
max_len = max(max_len, run(pa, r, c, curR, curC - 1, step + 1));
//如果上、下、左、右都不能走了,就返回现在的步数
return max_len;
}
//以数组中每一个位置开始,调用递归函数run进行路径求值,并将最深的路径保存在length变量中
int getMaxLen(int **pa, int r, int c)
{
int length = 0;
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
//将最大的值保存在length变量中
length = max(length, run(pa, r, c, i, j, 1));
}
}
return length;
}
int main()
{
//R:行, C:列, g:组,pArr:二维数组的指针
int R, C, g, **pArr;
cin >> g;
while (g--)
{
cin >> R >> C;
//动态创建二维数组
pArr = new int*[R];
for (int i = 0; i < R; ++i)
{
pArr[i] = new int[C];
for (int j = 0; j < C; ++j)
cin >> pArr[i][j]; //为二维数组赋值
}
//输出最长路径
cout << getMaxLen(pArr, R, C) << endl;
//释放动态分配的二维数组内存空间
for (int i = 0; i < R; ++i)
{
delete[] pArr[i];
}
delete[] pArr;
}
return 0;
}
ACM-Skiing
最新推荐文章于 2020-05-30 22:19:51 发布