Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

地质学家们打算考察一片山区。这片山区可分成m*n的网格,每个网格都有唯一的海拔高度,山区外围的海拔高度均为0。由于考察

任务繁重,他们分成m*n组,每个组考察一个网格的区域。每个组都可以选择从外围的任意一个位置出发进入山区,每次可以移

动到四周相邻的某个网格中,直到到达自己的目的地并完成考察后,再以同样方法从山区走到外围的任意一个位置。

这个山区的路是非常崎岖的,好在每个考察小组都拥有一辆十分先进的越野车。这种越野车有一个特点:它有两种模式:上升模式和

下降模式;当它处于上升模式时,无论四周网格比当前的高多少(可以相等),都可以上得去,但不能到达更低网格;当它处于

下降模式时,无论四周网格比当前的低多少(可以相等),都可以下得去,但不能到达更高网格;越野车可以在任何时候进行模

式转换,但每次转换都需要用掉一个“转换装置”;在出发前越野车可以选择任意一种模式,此时不需要“转换装置”。 这个“转换装置”是非常昂贵的,所以他们想知道每个小组最少需要多少个。

【输入格式】

输入文件mountain.in。第一行是两个整数m,n(1<=m,n<=100),表示网格数。接下来m行,每行n个整数,第i行第j个是hij(-

1000<=hij<=1000),表示第i行第j列的网格的海拔高度。

【输出格式】

输出文件mountain.out。m行,每行n个整数,第i行第j个是kij,表示考察第i行第j列的网格的小组最少需要多少个“转换装置”

。相邻两个数用一个空格隔开,行首、尾不能有多余空格。

【数据规模】

Sample Input1

3 3

9 4 2

2 1 6

7 2 5

Sample Output1

1 1 1

1 3 1

1 1 1

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u244

【题解】



题意:

让你从地图的外围开始往里面走;问你走进某个位置再从这个位置出来需要多少个转换装置;(上升状态和下降状态,只能做相应的变换)

做法:

从(0,0)号节点开始进行bfs;

(0,i),(i,0),(n+1,i),(i,m+1)这些点都是可以走的;

开始的时候0,0两个状态上升和下降都加入到队列中去;

然后设dis[x][y][2]表示到x,y这个点时是上升状态的最优解,和到(x,y)这个点时是下降状态的最优解;

bfs的时候搞dis数组就好;

搞完了进去;还要搞出去;

出去有两种方式;

设k为min(dis[i][j][0],dis[i][j][1]);

一种是按照进来的方式出去;那么就要多花费1次转换装置;即2*k+1;(如果高度全都一样且为0就按照下面另一种来算,也能考虑到的);

另一种是进去和出来的方式不一样;那么花费为dis[i][j][0]+dis[i][j][1];

因为dis[i][j][0]表示到达i,j时是上升的,dis[i][j][1]表示到i,j时是下降的;那么这两个状态是能够串联在一起的;因为i,j,1肯定是一个从一个h比i,j高的x,y下降到i,j的,那么i,j,0又代表上升状态,则可以按照i,j,1进来的状态再出去;且不用多花费一个转换装置;



【完整代码】

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream> using namespace std; const int MAXN = 110;
const int INF = 0x3f3f3f3f;
const int dx[5] = {0,0,0,1,-1};
const int dy[5] = {0,1,-1,0,0}; struct abc
{
int x,y,zt,num;
}; int n,m,h[MAXN][MAXN] = {0};
int dis[MAXN][MAXN][2];
queue <abc> dl; int main()
{
//freopen("F:\\rush.txt","r",stdin);
cin >> n >> m;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
cin >> h[i][j];
memset(dis,INF,sizeof(dis));
dis[0][0][0] = dis[0][0][1] = 0;
abc temp;
temp.x = 0,temp.y = 0,temp.zt = 0,temp.num = 0;
dl.push(temp);
temp.zt = 1;
dl.push(temp);
while (!dl.empty())
{
int x = dl.front().x,y = dl.front().y,zt = dl.front().zt,num = dl.front().num;
dl.pop();
for (int i = 1;i <= 4;i++)
{
int tx = x+dx[i],ty = y+dy[i];
if (tx <0 || ty <0 || tx >n+1 || ty > m+1)
continue;
abc tt;
if (h[tx][ty] == h[x][y])
{
if (dis[tx][ty][zt]>num)
{
dis[tx][ty][zt] = num;
tt.x = tx,tt.y = ty,tt.zt = zt,tt.num = num;
dl.push(tt);
}
}
int tnum = num;
if (h[tx][ty] > h[x][y])
{
if (zt==1)
tnum++;
if (dis[tx][ty][0]>tnum)
{
dis[tx][ty][0] = tnum;
tt.x = tx,tt.y = ty,tt.zt = 0,tt.num = tnum;
dl.push(tt);
}
}
if (h[tx][ty]<h[x][y])
{
if (zt == 0)
tnum++;
if (dis[tx][ty][1]>tnum)
{
dis[tx][ty][1] = tnum;
tt.x = tx,tt.y = ty,tt.zt = 1,tt.num = tnum;
dl.push(tt);
}
}
}
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
{
int k = min(dis[i][j][0],dis[i][j][1]);
dis[i][j][0] = min(2*k+1,dis[i][j][0]+dis[i][j][1]);
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
if (j==m)
printf("%d\n",dis[i][j][0]);
else
printf("%d ",dis[i][j][0]);
return 0;
}

最新文章

  1. testng教程之testng.xml的配置和使用,以及参数传递
  2. 关于AFNetworking中header的bug问题
  3. 如何使用AssemblyInfo中的Attribute?
  4. SAE saestorage.class.php文件的封装代码
  5. 医失眠灵验方--五味子50g 茯神50g 合欢花15g 法半夏15g
  6. 使用block来解决实现switch解决字符串
  7. WordPress Complete Gallery Manager插件‘upload-images.php’任意文件上传漏洞
  8. 执行 npm run update-webdriver 提示文件不能获取错误
  9. SpringBoot之简单日志配置
  10. AM335x(TQ335x)学习笔记——触摸屏驱动编写
  11. Oracle数据库date类型与Java中Date的联系与转化
  12. markdown 数学公式
  13. css 制作导航条布局
  14. 腾讯这套SpringMvc面试题你了解多少?(面试必备)
  15. Kaldi的data目录解析
  16. 02_搭建Nginx服务器
  17. Nginx 错误日志配置
  18. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案
  19. facebook广告上传Invalid appsecret_proof provided in the API argument
  20. Jersey构建restful风格的WebSerivices(二)

热门文章

  1. fc---输出历史命令列表
  2. Linux下关机命令的区别 (halt,poweroff,reboot,shutdown,init)
  3. web前端响应式布局,自适应全部分辨率
  4. pat(A) 2-06. 数列求和(模拟摆竖式相加)
  5. 码农的救赎:使用Github Pages搭建博客
  6. [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 线段树
  7. [NowCoder]牛客OI周赛3
  8. 4.dubbo-demo+简易监控中心安装+管理控制台安装
  9. BZOJ4044: [Cerc2014] Virus synthesis(回文树+DP)
  10. 处理async void 方法中无法捕捉异常信息