您的位置:首页 > 其它

poj 3984 迷宫问题 (广度优先BFS)

2013-03-27 21:29 316 查看
基本的广度优先搜索。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: