poj 3984 迷宫问题 (广度优先BFS)
2013-03-27 21:29
316 查看
基本的广度优先搜索。
更一般化的广度优先搜索过程,下面这个把close表也加上了,利用hash表来检查是否重复搜索:
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; }
相关文章推荐
- poj 3984 迷宫问题 BFS 图的广度优先搜索
- POJ-3984迷宫问题(典型BFS找最短路径)
- [POJ](3984)迷宫问题 ---BFS+队列模拟(图+队列模拟)***
- POJ 3984 迷宫问题(BFS:迷宫最短路径且输出路径)
- POJ 3984 迷宫问题(BFS+打印路径)
- POJ-3984-迷宫问题-BFS(广搜)-手写队列
- POJ-3984迷宫问题 (BFS,水题)
- poj 3984 迷宫问题(bfs)
- POJ 3984:迷宫问题【BFS】
- POJ 3984 迷宫问题(初识BFS)
- POJ 3984 迷宫问题(BFS)
- POJ 3984-迷宫问题(BFS+回溯路径)
- poj 3984 迷宫问题 bfs
- POJ 3984 迷宫问题 bfs 难度:0
- POJ 3984 迷宫问题(BFS+STL queue)
- POJ 题目3984 迷宫问题(BFS)
- poj 3984 迷宫问题(BFS,记录路径)
- bfs入门 poj 3984 迷宫问题
- poj 3984 迷宫问题(bfs)
- POJ 3984 迷宫问题(bfs+pair)