博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
周围区域问题
阅读量:4681 次
发布时间:2019-06-09

本文共 1531 字,大约阅读时间需要 5 分钟。

问题描述:

    给定二维平面,格点处要么是'X',要么是'O'。求出所有由'X'围成的区域。找到这样(多个)区域后,将所有的'O'转成'X'即可。如下图所示:

X X X X

X O O X

X X O X 

X O X X

变为:

X X X X

X X X X

X X X X

X O X X

 

思路分析:

 可以反向思考:哪些'O'应该是保留下来的呢?从边界开始搜索,如果中间的'O'可以跟边界处连通,则应该保留下来。那些在中间的'O'则应该变成'X'。

做法:

  • 从四周的边缘处开始搜索,做广度优先遍历,对于碰到的'O',标记为其他的字符,证明已经遍历过;
  • 做完上面的广度优先搜索后,再遍历一遍整个地图,把所有的其他字符的地方恢复成"O",把仍是“O”的改成“X”即可。
import java.util.LinkedList;import java.util.Queue;class Node {    int x;    int y;    public Node(int x, int y) {        this.x = x;        this.y = y;    }}class Regions {    private int[] rowdi = {-1, 1, 0, 0};    private int[] coldi = {0, 0, -1, 1};        /**     * BFS.      * Search begin from the edge to the interior.      * @param val     * @return     */    public int[][] check(int[][] val) {        if(val == null || val.length == 0 || val[0].length == 0)            return val;        Queue
q = new LinkedList
(); int row = val.length; int col = val[0].length; for(int i=0; i
= 0 && n.y+coldi[i] >= 0) { if(val[n.x+rowdi[i]][n.y+coldi[i]] == 0) { Node t = new Node(n.x+rowdi[i], n.y+coldi[i]); q.add(t); val[n.x+rowdi[i]][n.y+coldi[i]] = 2; } } } } for(int i=0; i

 

 

思考:前面遇到一个围棋的题目,在求某个位置的气时,也是需要求周围区域,这样连通的海洋区域就相当于气是一样的,就赋值成相同的数字。当时思路比较混乱,现在做完这个题目后可以回头完成那个题目了~ 算法就是这样,是一种思路,当具备一定的编程能力时,思路就成了最重要的东西。关键是思路!

 

  

转载于:https://www.cnblogs.com/little-YTMM/p/5480942.html

你可能感兴趣的文章
ms reportviewer 外联图片不显示的处理方式
查看>>
题解 P1034 【矩形覆盖】
查看>>
12.1 线程控制简介
查看>>
day 2 ,while ,编码,运算符 初识
查看>>
获得完整路径的代码
查看>>
四则运算之主要代码
查看>>
盒模型--边框(二)
查看>>
K60的DMA多路脉冲计数
查看>>
【模板】离散化
查看>>
LeetCode "Super Ugly Number" !
查看>>
LeetCode "Coin Change"
查看>>
LeetCode "488. Zuma Game" !
查看>>
虚函数、纯虚函数详解
查看>>
django mongodb配置
查看>>
Android Preference 实现长按监听 long-clickable
查看>>
03 django1.0.2 默认管理配置
查看>>
mysql 中 unix_timestamp和from_unixtime函数
查看>>
Java Web项目BlogAutoGenerator编写日志1
查看>>
简单数论(一)
查看>>
Populating Next Right Pointers in Each Node
查看>>