POJ 1088 滑雪 题解

POJ1062 昂贵的聘礼

滑雪

描述

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。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

Sample Input

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

Sample Output

25

解析

这道题是一道典型的dfs,所以直接放出代码。

关键的dfs部分:

void dfs(int x,int y,int res){
     
	if(res>ans) ans = res;
	if(x>=r||y>=c||x<0||y<0) return;
	if(step[x][y]>=res) return;
	else step[x][y] = res;
	if(x-1>=0&&h[x-1][y]<h[x][y])
    {
     
        res ++;
        dfs(x-1,y,res);
        res--;
    }
    if(x+1<r&&h[x+1][y]<h[x][y])
    {
     
        res++;
        dfs(x+1,y,res);
        res--;
    }
    if(y-1>=0&&h[x][y-1]<h[x][y])
    {
     
        res++;
        dfs(x,y-1,res);
        res--;
    }
    if(y+1<c&&h[x][y+1]<h[x][y])
    {
     
        res++;
        dfs(x,y+1,res);
        res--;
    }
}

完整代码:

#include
#include
#include
#include
using namespace std;

int r,c,h[105][105],step[105][105];
int a[4][2]={
     {
     1,0},{
     0,1},{
     -1,0},{
     0,-1}};
int ans;

void dfs(int x,int y,int res){
     
	if(res>ans) ans = res;
	if(x>=r||y>=c||x<0||y<0) return;
	if(step[x][y]>=res) return;
	else step[x][y] = res;
	if(x-1>=0&&h[x-1][y]<h[x][y])
    {
     
        res ++;
        dfs(x-1,y,res);
        res--;
    }
    if(x+1<r&&h[x+1][y]<h[x][y])
    {
     
        res++;
        dfs(x+1,y,res);
        res--;
    }
    if(y-1>=0&&h[x][y-1]<h[x][y])
    {
     
        res++;
        dfs(x,y-1,res);
        res--;
    }
    if(y+1<c&&h[x][y+1]<h[x][y])
    {
     
        res++;
        dfs(x,y+1,res);
        res--;
    }
}

int main(){
     
	scanf("%d%d",&r,&c);
	memset(step,0,sizeof(step));
	for(int i=0;i<r;++i) 
		for(int j=0;j<c;++j)
			scanf("%d",&h[i][j]);
	int mas = 0,inx,iny;
	ans = 0;
	for(int i=0;i<r;++i){
     
		mas = 0;
		for(int j=0;j<c;++j){
     
			if(h[i][j]>mas){
     
				inx = i;
				iny = j;
				mas = h[i][j];
			}
		}
		dfs(inx,iny,1);
	}
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(算法,POJ,dfs)