基本的广度优先搜索。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String...args){
Main main = new Main();
main.input();
main.process();
}
private void input(){
for(int i = 0; i < 5; i++)
for(int j = 0; j < 5; j++){
maze[i][j] = cin.nextInt();
}
}
private void process(){
open = new LinkedList<Node>();
Node start = new Node(0, 0);
start.pre = null;
open.add(start);
visit[0][0] = true;
Node parentNode;
Node nextOpen;
while(!open.isEmpty()){
parentNode = open.peek();
open.remove();
//遍历子节点
for(int i = 0; i < 4; i++){
//上
if(i == 0){
if(parentNode.x == 0) //没有上面
continue;
else if(maze[parentNode.x - 1][parentNode.y] == 1)//上面是墙
continue;
else{
nextOpen = new Node(parentNode.x - 1, parentNode.y);
}
}
//下
else if(i == 1){
if(parentNode.x == 4)
continue;
else if(maze[parentNode.x + 1][parentNode.y] == 1)
continue;
else{
nextOpen = new Node(parentNode.x + 1, parentNode.y);
}
}
//左
else if(i == 2){
if(parentNode.y == 0)
continue;
else if(maze[parentNode.x][parentNode.y - 1] == 1)
continue;
else{
nextOpen = new Node(parentNode.x, parentNode.y - 1);
}
}
//右
else{
if(parentNode.y == 4)
continue;
else if(maze[parentNode.x][parentNode.y + 1] == 1)
continue;
else{
nextOpen = new Node(parentNode.x, parentNode.y + 1);
}
}
nextOpen.pre = parentNode;
if(nextOpen.x == 4 && nextOpen.y == 4) {
//找到了
print(nextOpen);
}
if(!visit[nextOpen.x][nextOpen.y]){
visit[nextOpen.x][nextOpen.y] = true;
open.add(nextOpen);
}
}
}
}
private void print(Node node){
if(node.pre != null)
print(node.pre);
System.out.println("(" + node.x + ", " + node.y + ")");
}
private Scanner cin = new Scanner(System.in);
private int[][] maze = new int[5][5];
private Queue<Node> open;
private boolean visit[][] = new boolean[5][5];
}
class Node{
public Node(int x, int y){
this.x = x;
this.y = y;
}
public Node(){}
public int x;
public int y;
public Node pre;
}
更一般化的广度优先搜索过程,下面这个把close表也加上了,利用hash表来检查是否重复搜索:
package com.xujin;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String...args){
Main main = new Main();
main.input();
main.process();
}
private void input(){
for(int i = 0; i < 5; i++)
for(int j = 0; j < 5; j++){
maze[i][j] = cin.nextInt();
}
}
private void process(){
Node start = new Node(0, 0);
start.pre = null;
open.add(start);
Node parentNode;
Node nextOpen;
label:
while(!open.isEmpty()){
parentNode = open.peek();
close.add(parentNode);
open.remove();
//遍历子节点
for(int i = 0; i < 4; i++){
//上
if(i == 0){
if(parentNode.x == 0) //没有上面
continue;
else if(maze[parentNode.x - 1][parentNode.y] == 1)//上面是墙
continue;
else{
nextOpen = new Node(parentNode.x - 1, parentNode.y);
}
}
//下
else if(i == 1){
if(parentNode.x == 4)
continue;
else if(maze[parentNode.x + 1][parentNode.y] == 1)
continue;
else{
nextOpen = new Node(parentNode.x + 1, parentNode.y);
}
}
//左
else if(i == 2){
if(parentNode.y == 0)
continue;
else if(maze[parentNode.x][parentNode.y - 1] == 1)
continue;
else{
nextOpen = new Node(parentNode.x, parentNode.y - 1);
}
}
//右
else{
if(parentNode.y == 4)
continue;
else if(maze[parentNode.x][parentNode.y + 1] == 1)
continue;
else{
nextOpen = new Node(parentNode.x, parentNode.y + 1);
}
}
nextOpen.pre = parentNode;
if(nextOpen.x == 4 && nextOpen.y == 4) {
//找到了
print(nextOpen);
break label;
}
if(!close.contains(nextOpen)){
open.add(nextOpen);
}
}
}
}
private void print(Node node){
if(node.pre != null)
print(node.pre);
System.out.println("(" + node.x + ", " + node.y + ")");
}
private Scanner cin = new Scanner(System.in);
private int[][] maze = new int[5][5];
private Queue<Node> open = new LinkedList<Node>();;
private HashSet<Node> close = new HashSet<Node>();
}
class Node{
public Node(int x, int y){
this.x = x;
this.y = y;
}
public Node(){}
public int hashCode(){
return x * 10 + y;
}
public boolean equals(Object node){
if(this.hashCode() == node.hashCode()) return true;
return false;
}
public int x;
public int y;
public Node pre;
}