洛古 P1434 滑雪

Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可行的滑坡为24-17-16-1(从24开始,在1结束)。当然25-24-23―┅―3―2―1更长。事实上,这是最长的一条。

输入输出格式

输入格式:

输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。

输出格式:

输出区域中最长滑坡的长度。

输入输出样例

输入样例#1:
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

输出样例#1:
25











开始理解错了,以为是滑坡的长度是两个点高度的差,无奈居然通过了一部分数据,后来才发现不是这样,滑坡的长度等于滑过的点加1.
这题主要用到深度优先 +  记忆搜索  

#include
using namespace std;
int c,r;
int a[110][110];
int book[110][110];
int flag[110][110];
int max_num=0;
int ne[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int dfs(int x,int y){
	if(flag[x][y]) return flag[x][y]; 
	int t,num=0,temp=0;
	for(int k=0;k<4;k++){
		int tx,ty;
		tx= x +ne[k][0];
		ty= y +ne[k][1];
		if(tx<0||tx>r-1 ||ty<0 || ty>c-1) continue;
		if(book[tx][ty]==0 && a[x][y]>a[tx][ty]){
			book[tx][ty]=1;
			num =dfs(tx,ty)+1;	
			if(num > temp){
				temp = num;	
				flag[x][y]=num;		//保存路径 
			} 
			book[tx][ty]=0;
		}
	}
	return temp;
}
int main(){
	freopen("2.txt","r",stdin);
	cin>>r>>c;
	for(int i=0;i>a[i][j];
	}
	for(int i=0;i max_num) max_num=te+1;
	}
	cout<



你可能感兴趣的:(深度优先搜索)