导航

poj 1088-滑雪;NYOJ 10-skiing

Posted on 2013-07-18 20:01  勇敢的炮灰  阅读(125)  评论(0)    收藏  举报

点击打开链接poj

点击打开链接NYOJ

滑雪
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 67229   Accepted: 24704

Description

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

挺好的一道题,我使用了深搜,剪了一点枝,主要是记忆化搜索.先选择四周都高于自己的点开始往上深搜,碰到搜索过的点就比较以前的步数 小就继续往下搜,比以前的记录大就回溯回去搜其他的方向,最后遍历一遍整张地图,求得最大的点就是要求的值(两个OJ上的输入格式略有差别,这是POJ上的AC代码):

Memory: 1204K   Time: 16MS
Language: G++   Result: Accepted

#include<stdio.h>
#include<queue>
using namespace std;
typedef struct NODE
{
	int x, y;
}Node;
int map[101][101];
int step[101][101];
int r, c;
int s[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int max_num;
int count1;
void dfs(int x, int y, int st)
{
	count1++;
	if(step[x][y] >= st + 1)
		return;
	step[x][y] = st + 1;
	int new_x, new_y;
	int i;
	for(i = 0; i < 4; i ++)
	{
		new_x = x + s[i][0];
		new_y = y + s[i][1];
		if(new_x >= 0 && new_x < r && new_y >= 0 && new_y < c)
		{
			if(map[new_x][new_y] > map[x][y])
			{
				if(step[new_x][new_y] < step[x][y] + 1)
				{
					dfs(new_x, new_y, step[x][y]);
				}
			}
		}
	}
}
int main()
{
//	freopen("test.txt", "r", stdin);
	scanf("%d %d" , &r, &c);
	int i, j;
//	memset(step, 0, sizeof(step));
	max_num = -1;
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
		{
			scanf("%d", &map[i][j]);
		}
	}
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
		{
			if(step[i][j] == 0)
			{
				if(j + 1 >= c || map[i][j] <= map[i][j + 1])
				{
					if(j - 1 < 0 || map[i][j] <= map[i][j - 1])
					{
						if(i + 1 >= r || map[i][j] <= map[i + 1][j])
						{
							if(i - 1 < 0 || map[i][j] <= map[i - 1][j])
							{
								dfs(i, j, 0);
							}
						}
					}
				}
			}
		}
	}
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
		{
			if(max_num < step[i][j])
				max_num = step[i][j];
		}
	}
	printf("%d\n", max_num);
	return 0;
}