描述


给定一个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

题解


以水域为起点,使用bfs搜索,一旦一个水域搜到一个陆地,其它水域就不必搜到这个陆地,因为这已经是最短路了

import java.util.*;
import java.io.*;
public class Main {
static final int N = 810;
static final int M = (int) 7e5 + 10;
static final int inf = 0x3f3f3f3f;
int[][] ans = new int[N][N];
char[][] a = new char[N][N];
int[][] book = new int[N][N];
int n, m;
class node {
public int x, y, step;
node() {
};
node(int tx, int ty, int s) {
x = tx;
y = ty;
step = s;
};
} int nex[][] = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };
Queue<node> q = new LinkedList<>(); void bfs() {
node u = new node(), v = new node();
while (!q.isEmpty()) {
u = q.poll();
if (a[u.x][u.y] == '1')
ans[u.x][u.y] = Math.min(ans[u.x][u.y], u.step);
for (int i = 0; i < 4; i++) {
v.x = u.x + nex[i][0];
v.y = u.y + nex[i][1];
if (v.x >= n || v.y >= m || v.x < 0 || v.y < 0)
continue;
if (book[v.x][v.y] == 1)
continue;
book[v.x][v.y] = 1;
v.step = u.step + 1;
q.offer(new node(v.x, v.y, v.step));
}
}
} void solve() {
Scanner sc = new Scanner(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < n; i++)
Arrays.fill(ans[i], inf);
for (int i = 0; i < n; i++) {
a[i] = sc.next().toCharArray();
for (int j = 0; j < m; j++) {
if (a[i][j] == '0') {
q.offer(new node(i, j, 0));
ans[i][j] = 0;
}
}
}
bfs();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j > 0)
out.print(" ");
out.print(ans[i][j]);
}
out.println();
}
out.flush();
}
public static void main(String[] args) {
Main a = new Main();
a.solve();
}
}

【HIHOCODER 1478】 水陆距离(BFS)的更多相关文章

  1. HihoCoder - 1478 水陆距离

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

  2. hihocoder1478 水陆距离

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

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

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

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

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

  5. [BZOJ2252]矩阵距离(BFS)

    题意 输入矩阵m行n列(m<=500,n<=500),只含0.1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l). 示例: 输入: ...

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

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

  7. Codeforces Round #361 (Div. 2) B bfs处理

    B. Mike and Shortcuts time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

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

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

  9. hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. 模拟+位运算 HDOJ 5491 The Next

    题目传送门 题意:意思很简单,找一个最接近D且比D大的数,满足它的二进制表示下的1的个数在[S1, S2]之间 分析:从D + 1开始,若个数小于S1,那么从低位向高位把0替换成1直到S1就是最小值, ...

  2. JavaEE中一些缩写的含义

    EJB:Enterprise JavaBeans  (企业JavaBeans) XML:Extensible Markup Lauguage (可扩展标记语言) SOAP:Simple Object ...

  3. Steps to Resolve the Database JAVAVM Component if it Becomes INVALID After Applying an OJVM Patch

    11.2.0.2升级到11.2.0.4 memory_target 设置过小,只有800M. 导致jserver jave virtual machine 组件无法安装, 建议升级之前至少memory ...

  4. Coco dfs 或者 状压dp。...

    C -- Coco Time Limit:1s Memory Limit:64MByte Submissions:148Solved:85 DESCRIPTION Coco just learned ...

  5. ionic之自定义图片

    一个好的app,必须都有很好的ui设计师来设计界面,增强客户的体验,表现自己本身公司的特色,但是,在ionic中有些是无法用img标签直接引入图片,只能通过设定的css之后引入css. 页面: < ...

  6. [转]浅谈.NET下的多线程和并行计算(二)线程基本知识

    本文转自:http://www.cnblogs.com/lovecindywang/archive/2009/12/25/1632213.html 首先来看看如何创建线程: Console.Write ...

  7. P2044 随机数生成器

    链接:https://www.luogu.org/problem/show?pid=2044#sub 题目描述 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linea ...

  8. AJPFX关于Timer类的学习

    * Timer类:计时器public class Demo1 { public static void main(String[] args) throws InterruptedException ...

  9. 基于pymysql模块的增删改查

    上课笔记 重点:(熟练)多表查询创建存储过程原生sql索引原理 pymysql 封装好的客户端cursor 底层就是一个send操作commit 告诉mysql真的要完成修改操作(不然修改不会生效)e ...

  10. 【学习笔记】深入理解js原型和闭包(4)——隐式原型

    注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...