poj 1088-滑雪;NYOJ 10-skiing
2013-07-18 20:01
633 查看
点击打开链接poj
点击打开链接NYOJ
滑雪
Description
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为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
Sample Output
挺好的一道题,我使用了深搜,剪了一点枝,主要是记忆化搜索.先选择四周都高于自己的点开始往上深搜,碰到搜索过的点就比较以前的步数 小就继续往下搜,比以前的记录大就回溯回去搜其他的方向,最后遍历一遍整张地图,求得最大的点就是要求的值(两个OJ上的输入格式略有差别,这是POJ上的AC代码):
#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;
}
点击打开链接NYOJ
滑雪
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 67229 | Accepted: 24704 |
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<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;
}
相关文章推荐
- poj 1088-滑雪;NYOJ 10-skiing
- POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~
- POJ 1088 滑雪 && NYOJ 10 skiing
- POJ1088 滑雪 && NYOJ 10 skiing 经典的动态规划练习题
- poj 1088 && nyoj 10 滑雪(记忆化搜索)
- 搜索学习(1)--POJ 1088滑雪 && NYOJ 10
- nyoj10 poj 1088经典滑雪问题
- poj 1088/nyoj 10 滑雪(记忆化搜索/DP)
- 数据结构 动态规划DP (POJ 1088 && NYOJ 10)
- (DP6.1.4.2)POJ 1088 滑雪
- POJ 1088 滑雪 (dp)
- Poj 1088 滑雪
- poj 动态规划之1088 滑雪
- [POJ] 1088 -> 滑雪
- poj 1088 滑雪(动态规划:记忆化搜索)
- [ACM_NYOJ_10]Skiing(深度优先搜索&动态规划)
- poj 1088 滑雪 动态规划 记忆化搜索
- poj 1088滑雪------精简的dfs代码
- poj 1088 滑雪 深搜(谁说是DP了!)
- POJ 1088 滑雪(DP)