【u244】山地考察
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;
}
【u244】山地考察的更多相关文章
- coding题都在考察我们的什么技能
其实不是都在考我们的算法设计,有的时候算法简单,但是coding却可能不那么简单,比如下面这道题目: 题:写一个把字符串的IP地址变成32位整数的函数,要求考察程序健壮性. 这题初看起来一点都不难,但 ...
- 一个考察for循环题 讨论一下
一道Java程序题,主要是考察for循环如下所示: public class Test { static boolean fun(char c) { System.out.print(c); retu ...
- Google Play市场考察报告-2
接上文,本次继续考察App. (6)CNBETA win8平板客户端 cnBeta是国内少有的科技类资讯网站,在程序员群体中具有很大影响力.面向程序员的软件应用在APP中一向属于少数,然而程序员群体已 ...
- Google Play市场考察报告
考察了Google Play日本市场的10款应用,考察的重点在于每个App有什么亮点,盈利模式在哪里.本文并不是App的功能介绍. (1)恋爱文集[文库类应用] 该应用收录了一些恋爱文章,其主要受众是 ...
- 杨佩昌:中国官员去德国考察看什么两眼发光 z
令中国人诧异的德国物价 只要是花费大量人工的行业,就很贵 □杨佩昌 德国是欧洲商品价格的洼地,连精明的瑞士人也开车到德国加油购物 一 2012年凤凰网组织十大著名博主前往澳洲考察并与前总理陆克文对话, ...
- 考察printf函数返回值
最近偶然间见了这样一道题: #include<stdio.h> int main() { ; printf("%d\n",printf("%d", ...
- POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
题目链接: http://poj.org/problem?id=3923 题意描述: 输入一个n*m的屏幕 该屏幕内有至少一个对话框(每个对话框都有对应的字母表示) 判断并输出该屏幕内处于最表层的对话 ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
- 互联网公司的面试官是如何360°无死角考察候选人的?[z]
[z]https://juejin.im/post/5c0e47ebf265da614e2be9a7 一.写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不 ...
随机推荐
- JS错误记录 - 右侧悬浮框 - 缓冲运动
本次练习错误总结: 1. 正确: startMove( document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop); ...
- factor---将素数分解为质数
- 今日题解------codeforce 893d
题意:给你一个数列,小于零表示表示信用卡里取出钱,大于零表示信用卡里存钱,等于零表示要查询信用卡, 如果被查到信用卡里的钱小于零,那你就GG,或者在任何时候你的信用卡里的钱大于d的话(不需要找ai等于 ...
- 制作U盘启动盘将Ubuntu 12.04升级为14.04的方法
1 介绍 在周六的下午,我决定想高速浏览一下书籍[1].看看这个关于Ubuntu的圣经到底在讲什么东东. 感觉讲的不错,当我看到介绍文件标记语言-TeX和LaTeX的时候,该书作者推荐在Ubuntu上 ...
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...
- 8lession-基础类型转化
Python数据类型转换 有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可. 以下几个内置的函数可以执行数据类型之间的转换.这些函数返回一个新的对象,表示转换 ...
- 妙味css3课程---1-2、css3中新增的伪类和伪元素有哪些
妙味css3课程---1-2.css3中新增的伪类和伪元素有哪些 一.总结 一句话总结: 1.div:target{}是什么意思? 比如a标签的锚点链接到div,div:target{}就可以找到这个 ...
- 24.Node.js Stream(流)
转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- beego的orm ,用的数据库sqlite3
测试 beego的orm ,用的数据库sqlite3 1 package main import ( "fmt" "github.com/astaxie/beego/or ...
- iOS 友盟分享
iOS 友盟分享 这个主要是提到怎样通过友盟去自己定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的project目录里面去. 二.注冊友盟账号.将你的APP加入到你的账 ...