View Code of Problem 17

#include<iostream>

using namespace std;

int k = 0;//用于记录最长步数

void func(int **arr, int i, int j, int n, int m, int temp)//递归遍历所有可能爬到的顶点
{
	if (i > 0)										//上
		if (arr[i][j] < arr[i - 1][j])
			func(arr, i - 1, j, n, m, temp + 1);
	if (i < n - 1)									//下
		if (arr[i][j] < arr[i + 1][j])
			func(arr, i + 1, j, n, m, temp + 1);
	if (j > 0)										//左
		if (arr[i][j] < arr[i][j - 1])
			func(arr, i, j - 1, n, m, temp + 1);
	if (j < m - 1)									//右
		if (arr[i][j] < arr[i][j + 1])
			func(arr, i, j + 1, n, m, temp + 1);
	if (temp > k)//若当前所爬步数大于已记录的最长步数,则更新最长步数
		k = temp;
}

int main() {
	int n, m;
	while (cin >> n >> m)
	{
		int **arr = new int*[n];
		for (int i = 0; i < n; i++)
		{
			arr[i] = new int[m];
			for (int j = 0; j < m; j++)
				cin >> arr[i][j];
		}
		for (int i = 0; i < n; i++)//二层for循环,从任意顶点出发开始爬楼梯
			for (int j = 0; j < m; j++)
				func(arr, i, j, n, m, 0);//从i,j出发
		cout << k << endl;
		k = 0;
	}
	return 0;
}

Double click to view unformatted code.


Back to problem 17