水陆距离

描述

  给定一个N x M的01矩阵,其中1表示陆地,0表示水域。对于每一个位置,求出它距离最近的水域的距离是多少。

  矩阵中每个位置与它上下左右相邻的格子距离为1。

输入

  第一行包含两个整数,N和M。

  以下N行每行M个0或者1,代表地图。

  数据保证至少有1块水域。

  对于30%的数据,1 <= N, M <= 100

  对于100%的数据,1 <= N, M <= 800

输出

  输出N行,每行M个空格分隔的整数。每个整数表示该位置距离最近的水域的距离。

样例输入

4 4
0110
1111
1111
0110

样例输出

0 1 1 0
1 2 2 1
1 2 2 1
0 1 1 0
时间限制:10000ms
单点时限:1000ms
内存限制:256MB

题目解析
  本题给出n m之后给出一个n * m的水陆分布图0代表水1代表路,要求输出每个点距离其最近的水的距离所组成的距离矩阵。

  本题使用BFS获取每个点到0点的最近距离,但如果暴力所有点的话是要超时的,结合BFS的特性,BFS每次入队的都是上一个点可以一步抵达的点,那么我们初始将所有的0点入队,以这些0点像周围搜索,记录每个点的最短入队层次即可。

  AC代码

 #include <bits/stdc++.h>
using namespace std;
const int MAX = ;
struct node{
int x, y;
int step; //step记录入队的层次
}Node;
int G[MAX][MAX]; //记录给出的图
int n, m;
bool vis[MAX][MAX]; //bool判断每个点是否已经走过
int ans[MAX][MAX]; //记录每个点距离水的最近距离
//上下左右四个方向
int X[] = {, , -, };
int Y[] = {, , , -};
bool judge(int x, int y){ //判断某位置是否可以走
if(x < || y < || x >= m || y >= n) //超边界
return false;
if(vis[y][x] == true) //已经走过
return false;
return true;
}
queue<node> Q;
void BFS(){
while(!Q.empty()){
node top = Q.front();
ans[top.y][top.x] = top.step; //每个点的入队层数便是其距离水的最近距离
Q.pop();
for(int i = ; i < ; i++){ //判断上下左右四个方向的点是否可以走
int newX = top.x + X[i];
int newY = top.y + Y[i];
if(judge(newX, newY)){ //若可以走将新的点入队并标记为已走过,层数为前一个点加一
vis[newY][newX] = true;
Node.x = newX;
Node.y = newY;
Node.step = top.step + ;
Q.push(Node);
}
}
}
}
int main()
{
scanf("%d%d", &n, &m); //输入nn
for(int i = ; i < n; i++){ //输入n * m的矩阵
string str;
cin >> str;
for(int j = ; j < m; j++){
G[i][j] = str[j] - '';
}
}
for(int i = ; i < n; i++){ //将所有的0预先入队
for(int j = ; j < m; j++){
if(G[i][j] == ){
Node.x = j;
Node.y = i;
Node.step = ;
vis[i][j] = true;
Q.push(Node);
}
}
}
BFS(); //搜索获得答案
for(int i = ; i < n; i++){ //输出最短距离矩阵
for(int j = ; j < m; j++){
if(j != )
printf(" ");
printf("%d", ans[i][j]);
}
printf("\n");
}
return ;
}

HihoCoder - 1478 水陆距离的更多相关文章

  1. hihocoder1478 水陆距离

    地址:http://hihocoder.com/problemset/problem/1478 题目: 水陆距离 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个 ...

  2. 【HIHOCODER 1478】 水陆距离(BFS)

    描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数,N和M. ...

  3. hihocoder offer收割编程练习赛9 B 水陆距离

    思路: 宽搜,多个起点. 实现: #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  4. 【[Offer收割]编程练习赛9 B】水陆距离

    [题目链接]:http://hihocoder.com/problemset/problem/1478 [题意] [题解] 一开始把所有的水域的位置都加入到队列中去; 然后跑一个bfs. 第一次到达的 ...

  5. H - 遥远的糖果 HihoCoder - 1478

    给定一个N x M的01矩阵,其中1表示人,0表示糖.对于每一个位置,求出每个位置离糖的最短距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N和M. 以下 ...

  6. [Offer收割]编程练习赛9,10

    题目1 : 闰秒 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差. ...

  7. OJ题解记录计划

    容错声明: ①题目选自https://acm.ecnu.edu.cn/,不再检查题目删改情况 ②所有代码仅代表个人AC提交,不保证解法无误 E0001  A+B Problem First AC: 2 ...

  8. hihocoder 1931 最短管道距离

    描述 在一张2D地图上有N座城市,坐标依次是(X1, Y1), (X2, Y2), ... (XN, YN). 现在H国要修建一条平行于X轴的天然气主管道.这条管道非常长,可以认为是一条平行于X轴的直 ...

  9. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

随机推荐

  1. oracle只导出触发器

    只要触发器,其他都不要 方法1:plsql develop调用exp:tools->export object—>trigger 方法2:select dbms_metadata.get_ ...

  2. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  3. SpringBoot相知

    前言 这篇文章的将介绍表单验证,AOP处理请求和统一异常处理,案例是延续上一篇 SpringBoot初识 表单验证 现在将要拦截未满18岁的女生,在之前GirlController里面添加一个女生的方 ...

  4. C# 控件绘制

    绘制方法: 1.在控件的paint事件中绘制 2.绘制成图片,然后作为背景图或图片贴到工作区. Bitmap bmp = new Bitmap(IWidth, this.Height); Graphi ...

  5. 如何使用T-SQL备份还原数据库及c#如何调用执行?

    准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup database 数据库名 to disk='保存路径 ...

  6. FFmpeg软硬解和多线程解码

    一. AVCodecContext解码上下文 1.avcodec_register_all() : 注册所有的解码器 2.AVCodec *avcodec_find_decoder(enum AVCo ...

  7. 【新题】ocp 062 2019年考试新题-3

    3.A database is open read write and the instance has multiple sessions some of which have active tra ...

  8. python中 使用join()方法 对各种数据类型中元的素进行合并拼接

    "连接符".join(列表或元组或字符串或字典) 返回的是一个使用连接符进行拼接的字符串 如果对象是列表,元组,就是以一个下标元素为单位进行拼接 如果对象是字符串,就是一个单词元素 ...

  9. 欢迎使用CSDN-markdown编辑器a

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  10. hdoj1180 诡异的楼梯(bfs+奇偶判断)

    手癌!日常手癌!被自己气死! #include<iostream> #include<cstring> #include<queue> #include<al ...