标签:
二哥与女朋友到黄山旅行。他们在山上玩了一整天,发现天色已晚,该回家了。而突然又开始下起了雨,二哥的女朋友表示非常不爽:“都是你搞的,早知道就不和你来了。”
二哥当然不能抛下女朋友不管,并且二哥也不想露宿在山上。于是他摊开被雨淋湿的地图。
黄山地图是一个N*N的矩阵,矩阵中的每一项表示那个地方的高度。二哥与女朋友处在左上角,他们的住处在右下角。在矩阵中可以朝上下左右走,但不能沿着对角线行走。二哥的女朋友不喜欢颠簸,所以二哥需要找到一条回到住处的路径,使得路径上的最高点与最低点之差尽量小,而不需要管这条路径有多长。
第一行:N 接下来N行 N*N的整数矩阵,(0≤每点的高度≤110 )。 (2≤N≤100)
一个整数,表示颠簸最小的路径中最高点与最低点的高度差。
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
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 }
标签:
原文地址:http://www.cnblogs.com/wenma/p/4439576.html