水陆距离

描述

  给定一个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. Spine输出资源一键入Unity3D工具代码

    之前预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生Sprite Tree或Uni2D)要更适合有3DSMax习惯的美术,即Spine更容 ...

  2. EasyUi 合并单元格占列显示

    $("#TableContainer").datagrid({                url: '',                method: "get&q ...

  3. TextBox 加阴影

    <Border.Effect> <DropShadowEffect x:Name="dse" BlurRadius="8" ShadowDep ...

  4. MPU6050学习笔记(电源管理器1、2)

    Technorati Tags: 嵌入式开发.模块开发 寄存器107号:电源管理器1 PWR_MGMT_1: Description: This register allows the user to ...

  5. 将tomcat添加到服务中

    转载自:http://blog.csdn.net/zjd934784273/article/details/47701011(windows) :http://www.cnblogs.com/ilah ...

  6. tensorflow的日常Demo

    Session Session 是 Tensorflow 为了控制,和输出文件的执行的语句. 运行 session.run() 可以获得你要得知的运算结果, 或者是你所要运算的部分. 01-graph ...

  7. Manacher算法学习笔记

    前言 Manacher(也叫马拉车)是一种用于在线性时间内找出字符串中最长回文子串的算法 算法 一般的查找回文串的算法是枚举中心,然后往两侧拓展,看最多拓展出多远.最坏情况下$O(n^2)$ 然而Ma ...

  8. 快速排序的理解和实现(Java)

    快速排序介绍 快速排序(Quick Sort)使用分治法策略,其基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进 ...

  9. Swift 基本数据类型与运算符表达式

    // // main.swift // LessonSwift01 // // Created by lanouhn on 16/1/25. // Copyright © 2016年 齐彦坤. All ...

  10. HTTP协议及WWW服务应用

    一.用户访问网站的流程图 二.DNS解析的流程图 三.用户访问网站的基本流程原理阐述 ① 用户在浏览器中输入请求的地址回车 ② 先找本地的缓存和Hosts文件,有解析的对应IP直接返回个客户端IP地址 ...