平面上的地图搜索--Java学习笔记(四)
版权声明:
本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处.
这一个月以来,都在学习平面上的地图搜索,主要涉及到深度优先搜索(DFS)和广度优先搜索(BFS)。这两个算法和相关数据结构我整整学习了一个月,中间经历了很多对自己畏难情绪的克服,现在终于搞懂了,不过并没有掌握得很好。要想掌握得很好,需要后期编码来巩固加强了。
先从这道leetcode上面的题目作为引子:
Number of islands(200)
Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands.An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically.You may assume all four edges of the grid are all surrounded by water.

开始看到这道题目时,我的内心是崩溃的。因为我完全是连题目都看不懂,什么是islands?
private int m, n;
public int numIslands(char[][] grid) {
m = grid.length;
if (m == 0) {
return 0;
}
n = grid[0].length;
if (n == 0) {
return 0;
}
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != '1') {
continue;
ans++;
dfs(grid, i, j);
}
}
return ans;
}
public void dfs(char[][] grid, int i, int j) { \\dfs是一种查找方式,所以没有返回值
if (i < 0 || i >= m || j < 0 || j >= n) {
return;
}
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
}
}


import java.util.Deque;
public static void main(String[] args) {
char[][] grid = new char[][] {
{ '0', '1', '1', '0' },
{ '1', '0', '0', '1' },
{ '1', '0', '0', '1' },
{ '1', '1', '0', '0' } };
System.out.println("#islands=" + new Solution().numIslands(grid));
}
private static class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static class Solution {
public int numIslands(char[][] grid) {
int res = 0;
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
boolean[][] visited = new boolean[row][col];
int[][] directions = {
{ 1, 0 },
{ -1, 0 },
{ 0, 1 },
{ 0, -1 } };
Deque<Point> queue = new ArrayDeque<Point>();
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j] == '0' || visited[i][j]) {
continue;
}
queue.add(new Point(i, j));
res += 1;
while (!queue.isEmpty()) {
int x = tpx + directions[k][0]; // 0
int y = tpy + directions[k][1]; // 1
if (x >= 0 && x < row && y >= 0 && y < col && grid[x][y] == '1'
&& !visited[x][y]) {
queue.add(new Point(x, y));
}
}
}
}
}
return res;
}
}
平面上的地图搜索--Java学习笔记(四)的更多相关文章
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- 初涉深度优先搜索--Java学习笔记(二)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...
- Java学习笔记四——运算符
算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...
- Java 学习笔记 (四) Java 语句优化
这个问题是从headfirst java看到的. 需求: 一个移动电话用的java通讯簿管理系统,要求最有效率的内存使用方法. 下面两段程序的优缺点,哪个占用内存更少. 第一段: Contact[]c ...
- Java学习笔记四:Java的八种基本数据类型
Java的八种基本数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布 ...
- Java学习笔记四:三目运算符与字符串连接符等
一 .三目运算符与自增自减 GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac02.java 条件运算符由 ...
- Java学习笔记四
1.简介.进程和线程:简单的说就是进程负责为程序开辟内存空间,线程负责具体的执行单元(执行路径). 一个进程中可以有多个执行路径,称为多线程.CPU一次只能执行一个进程,但是一个进程内部可以有多个线程 ...
- 面向对象三大特征之封装与static——(Java学习笔记四)
面向对象 编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- python callable 函数
callable(object) 中文说明:检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功. 注意:类是可调用的 ...
- Python twisted article
学习python twisted 的好文章 An Introduction to Asynchronous Programming and Twisted Reference: http://kron ...
- SQL四种语言
1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...
- dev使用3
http://www.cnblogs.com/yuerdongni/archive/2012/09/08/2676748.html http://www.cnblogs.com/yuerdongni/ ...
- Angular - - angular.identity和angular.noop
angular.identity 函数返回本身的第一个参数.这个函数一般用于函数风格. 格式:angular.identity() 使用代码: (function () { angular.modul ...
- CSS 简介、语法、派生选择器、id 选择器、类选择器、属性选择器
CSS 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现 ...
- Adapter接口及实现类
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为A ...
- javascript获取整数随机数
javascript获取整数随机数 // 从4到10的随机数,|0是生成正整数 var numBars = Math.random()*6+4|0; 也可以通过右移0位(或者左移0位)进行取整 var ...
- 将 Callout 容器添加到移动设备应用程序中
在移动设备应用程序中,callout 是在应用程序顶部弹出的容器.该容器可以容纳一个或多个组件,并且支持不同类型的布局. callout 容器可以是模态或非模态容器.模态容器在其关闭之前接受所有的键盘 ...
- Canvas文本绘制
文字绘制: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...