ACM-Skiing

/*
	第一行表示有几组测试数据,输入的第二行表示区域的行数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值