码迷,mamicode.com
首页 > 编程语言 > 详细

【算法、bfs】二哥在黄山

时间:2015-05-03 21:56:00      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

Description

二哥与女朋友到黄山旅行。他们在山上玩了一整天,发现天色已晚,该回家了。而突然又开始下起了雨,二哥的女朋友表示非常不爽:“都是你搞的,早知道就不和你来了。”

二哥当然不能抛下女朋友不管,并且二哥也不想露宿在山上。于是他摊开被雨淋湿的地图。

黄山地图是一个N*N的矩阵,矩阵中的每一项表示那个地方的高度。二哥与女朋友处在左上角,他们的住处在右下角。在矩阵中可以朝上下左右走,但不能沿着对角线行走。二哥的女朋友不喜欢颠簸,所以二哥需要找到一条回到住处的路径,使得路径上的最高点与最低点之差尽量小,而不需要管这条路径有多长。

Input Format

第一行:N 接下来N行 N*N的整数矩阵,(0110 )。 (2N100)

Output Format

一个整数,表示颠簸最小的路径中最高点与最低点的高度差。

Sample Input

5
1 1 3 6 8
1 2 2 5 5
4 4 0 3 3
8 0 2 3 4
4 3 0 2 1

Sample Output

2

======================
  开始立马想到最短路径问题,然后就想能不能用动态规划,但是发现不好找状态,因为路径是固定的。最后用类似dijstra解决了,本质就是广度优先。
  实现的时候地图和所在路径最高值和最低值(不能直接储存差值,否则无法和当前点进行对比)都是用数组储存的,略繁琐。
结果并没有通过,经别人点拨后发现这样确实不行,因为只根据差值判断是否最优有点类似贪心了,无法保证后面路径的选择正确,因为后面路径选择还得考虑最大值和最小值。以后改正。
==========================
c++代码如下:
 1 //二哥在黄山 
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main(){
 6     int n,i,j;
 7     bool flag = 1;
 8     cin>>n;
 9     // map为地图 open为是否待选择 highest和lowest表示所在路径最高和最低点值
10     //初始化 
11     int map[n][n],open[n][n],highest[n][n],lowest[n][n]; 
12     for (i=0;i<n;++i)
13         for (j=0;j<n;++j) {
14             cin>>map[i][j];
15             open[i][j] = 0;
16             lowest[i][j] = 0;
17             highest[i][j] = 110;
18         }
19     open[0][0] = 1;
20     highest[0][0]=lowest[0][0]=map[0][0];
21     
22     while (flag) {
23         int col,raw,min = 1100,temhigh,temlow;
24         flag = 0;
25         //遍历open表,找到已经存在的最稳路径 
26         for (i=0;i<n;++i)
27             for (j=0;j<n;++j) 
28                 if (open[i][j] == 1 && highest[i][j]-lowest[i][j]<min) {
29                     col = j;
30                     raw = i;
31                     min = highest[i][j]-lowest[i][j];
32                     flag = 1;
33                 }
34         if (raw == n-1 && col == n-1) break;
35         //对该点的前后左右四个点扫描,改变其highest和lowest值并加入open表 
36         open[raw][col] = 0;//cout<<raw+1<<col+1<<‘ ‘<<highest[raw][col]-lowest[n-1][n-1]<<endl; 
37         if (raw>0) {
38             temhigh = highest[raw][col]>map[raw-1][col] ? highest[raw][col]:map[raw-1][col];
39             temlow = lowest[raw][col]<map[raw-1][col] ? lowest[raw][col]:map[raw-1][col];
40             if (temhigh-temlow<highest[raw-1][col]-lowest[raw-1][col]) {
41                 open[raw-1][col] = 1;
42                 highest[raw-1][col] = temhigh;
43                 lowest[raw-1][col] = temlow;
44             }
45         }
46         if (col>0) {
47             temhigh = highest[raw][col]>map[raw][col-1] ? highest[raw][col]:map[raw][col-1];
48             temlow = lowest[raw][col]<map[raw][col-1] ? lowest[raw][col]:map[raw][col-1];
49             if (temhigh-temlow<highest[raw][col-1]-lowest[raw][col-1]) {
50                 open[raw][col-1] = 1;
51                 highest[raw][col-1] = temhigh;
52                 lowest[raw][col-1] = temlow;
53             }
54         }
55         if (raw<n-1) {
56             temhigh = highest[raw][col]>map[raw+1][col] ? highest[raw][col]:map[raw+1][col];
57             temlow = lowest[raw][col]<map[raw+1][col] ? lowest[raw][col]:map[raw+1][col];
58             if (temhigh-temlow<highest[raw+1][col]-lowest[raw+1][col]) {
59                 open[raw+1][col] = 1;
60                 highest[raw+1][col] = temhigh;
61                 lowest[raw+1][col] = temlow;
62             }
63         }
64         if (col<n-1) {
65             temhigh = highest[raw][col]>map[raw][col+1] ? highest[raw][col]:map[raw][col+1];
66             temlow = lowest[raw][col]<map[raw][col+1] ? lowest[raw][col]:map[raw][col+1];
67             if (temhigh-temlow<highest[raw][col+1]-lowest[raw][col+1]) {
68                 open[raw][col+1] = 1;
69                 highest[raw][col+1] = temhigh;
70                 lowest[raw][col+1] = temlow;
71             }
72         }    
73     }
74     cout<<highest[n-1][n-1]-lowest[n-1][n-1];
75     return 0;
76 }

 

【算法、bfs】二哥在黄山

标签:

原文地址:http://www.cnblogs.com/wenma/p/4439576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!