水陆距离

描述

  给定一个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. [mobile]移动端页面没有重新请求时,刷新页面代码

    <input type="hidden" value="yes" id="id_if_reload" /> <script ...

  2. dstat常用参数组合

    io/if/vm三合一 dstat -cdlmnpsy dstat --top-mem --top-cpu --top-io

  3. 对Cookie和Session的理解

    本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~! Cookie和Session的产生背景: 在动态页面里面,每个变量都是有有效期的,所有的变量的最大生命周期就是一个脚本的周期( ...

  4. 5.WebAPI的Filter

    1.WebApi的Filter介绍: 大家知道什么是AOP(aspect oriented programming)吗?它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  5. 安装webpack常见错误之一

    我安装webpack时,出现如下错误: C:\Users\admin> npm install webpack -gnpm WARN checkPermissions Missing write ...

  6. 解决 EntityFrameworkCore 执行 Add-Migration命令提示无法识别转义符的错误

    版本.asp.net core 2.0   EntityFrameworkCore2,0,. 之前执行Add-Migration 命令 提示无法识别的转义序列,各种不成功, 解决办法,找到 项目里面的 ...

  7. .net core获取服务器本地IP及Request访问端口

    string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + ...

  8. C#如何关闭指定进程

    public static void KillProcess(string strProcessesByName)//关闭线程 { foreach (Process p in Process.GetP ...

  9. linq to sql 查找所有开票金额大于回款金额的项目

    查找所有开票金额大于回款金额的项目 TB_Projects 项目表 TB_Recipts 发票表 TB_Finances 回款表 TB_Projects  一对多 TB_Recipts TB_Proj ...

  10. Day 43数据库(Day1)

    创建表. create table student( id int not null auto_increment PRIMARY key, name archar() not null, age i ...