广度优先搜索
理解与总结
广度优先算法适用于遍历无向图,可以按照每个节点被发现的顺序,不重复地进行遍历;还有就是一般题目需要查找最短路径时,也可以用广度优先搜索来解决,因为它是从当前层开始一层一层遍历,也就是可以找到达目标点的最短路径(两点间直线最短)。其实这两种用法区别不大,如果给遍历无向图加以一个终止条件,也就是寻找最短路径。
例题
题目
1113. 红与黑
思路
这道题我们把所谓的一系列字符串抽象成图的话,我们发现可以用广度优先搜索去遍历这个图,加上遇到#时就特判,可以解决这个问题,比较简单的一道题,可以用来练习广度优先搜索,搜索过程我在图里面举例了是怎么搜索的,结合代码可以很好理解了。
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
/*
* 使用广度优先搜索
* 用map[H][W] 数组存储地图
* 用boolMap[H][W] 数组判重
* int res = 1;
* if(!bolMap[H][W]) res++;
* 最后输出res
* */
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] read;
do {
read = in.readLine().split(" ");
int W = Integer.parseInt(read[0]);
int H = Integer.parseInt(read[1]);
if (W == 0 && H == 0) break;
char[][] map = new char[H][W];
boolean[][] boolMap = new boolean[H][W];
Queue<PII> queue = new LinkedList<>(); //建立栈
for (int i = 0; i < H; i++) {
String str = in.readLine();
if (str.contains("@")) {
PII star = new PII(i, str.indexOf('@'));
queue.offer(star);
boolMap[star.x][star.y] = true;
}
map[i] = str.toCharArray();
}
int res = 1; //记录黑瓷砖数量
int[] dx = {0, -1, 0, 1};
int[] dy = {-1, 0, 1, 0};
while (!queue.isEmpty()) {
PII path = queue.poll();
for (int i = 0; i < 4; i++) {
int tempX = path.x + dx[i], tempY = path.y + dy[i];
if (tempX < 0 || tempX >= H || tempY < 0 || tempY >= W || map[tempX][tempY] != '.' || boolMap[tempX][tempY])
continue;
boolMap[tempX][tempY] = true;
res++;
queue.offer(new PII(tempX, tempY));
}
}
System.out.println(res);
}while (true);
}
static class PII {
int x;
int y;
public PII(int x, int y) {
this.x = x;
this.y = y;
}
}
}