您的位置:首页 > 其它

poj 1088-滑雪;NYOJ 10-skiing

2013-07-18 20:01 633 查看
点击打开链接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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: