穿越雷区之javaBFS
本题为2015年第六届蓝桥杯javaB组第4题。
考点:图的广度优先搜索。类似于一个分层搜索的过程,广度优先搜索需要用到队列以保持访问过的图节点的顺序,一般用来求“最短路径”。
题目描述
解题思路
定义一个char型二维数组map用于接收“地图”。
找到入口‘A’,从‘A’点开始bfs,最后找到终点‘B’。
详细请看代码
源码
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
//A+-+-
//-+--+
//-+++-
//+-+-+
//B+-+-
public class Tank {
static int n;
// 定义四个方向
static int[] bx = { -1, 1, 0, 0 };
static int[] by = { 0, 0, -1, 1 };
static char[][] map = new char[101][101];
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
for (int i = 0; i < n; i++) { // 输入地图
String str = scanner.next();
for (int j = 0; j < n; j++) {
map[i][j] = str.charAt(j);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 'A') { // 寻找起点A
bfs(i, j);
break;
}
}
}
}
public static void bfs(int x, int y) {
int[][] vision = new int[n][n]; // 用于标记某点是否被访问过
Queue<poi> queue = new LinkedList<poi>(); // 定义队列queue
int row, col, step_n; // 定义三个中间变量
poi p1 = new poi(x, y, 0);
vision[x][y] = 1;
queue.offer(p1);
while (!queue.isEmpty()) {
poi p2 = queue.poll();
row = p2.x;
col = p2.y;
step_n = p2.step;
for (int i = 0; i < 4; i++) { // 向四个方向探索
if (row + bx[i] >= n || row + bx[i] < 0 || col + by[i] >= n || col + by[i] < 0) {
continue; // 越界
}
if (vision[row + bx[i]][col + by[i]] == 0) {
if (map[row][col] != map[row + bx[i]][col + by[i]]) {
poi p = new poi(row + bx[i], col + by[i], step_n + 1);
queue.offer(p);
vision[p.x][p.y] = 1;
if (map[p.x][p.y] == 'B') { // 到达B点
System.out.println(p.step);
return;
}
}
}
}
}
System.out.println(-1);
return;
}
}
//定义一个用于记录当前位置的类
class poi {
public int x; // 记录该点的横坐标
public int y; // 记录该点的纵坐标
public int step; // 记录从起点走到该点的步数
public poi(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
}
}