bfs_迷宫求最短路径

宽度优先搜索按照距离开始状态由近及远的顺序进行搜索,可以很容易用来求解最短路径或者最少操作等问题。

将已经访问过的状态用标记管理起来,便可以很好地做到由近及远的搜索。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static int n,m;
    static char[][] maze;
    static int [][] dis;
    final static int INF = 100000000;
    static int gx,gy;
    static int sx,sy;
    
    static int dx[] = new int[]{1,0,-1,0};
    static int dy[] = new int[]{0,1,0,-1};
    
    static int bfs(){
        
        Queue<Pair> queue = new LinkedList();
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++)
                dis[i][j] = INF;
        }

        queue.add(new Pair(sx,sy));
        dis[sx][sy] = 0;
        
        while(!queue.isEmpty()){
            Pair p = queue.remove();
            System.out.println(p.x + " "+ p.y);
            if(p.x == gx && p.y == gy) break;
            
            for(int i = 0; i < 4; i++){
                int nx = p.x + dx[i]; 
                int ny = p.y + dy[i];
                if(0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' && dis[nx][ny] == INF){
                    queue.add(new Pair(nx,ny));
                    dis[nx][ny] = dis[p.x][p.y] + 1;
                }    
            }
        }
        
        return dis[gx][gy];
    
    }
    

    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        maze = new char[n][m];
        dis = new int[n][m];
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                maze[i][j] = in.next().charAt(0);
                if(maze[i][j] == 'S'){
                    sx = i;
                    sy = j;
                }
                if(maze[i][j] == 'G'){
                    gx = i;
                    gy = j;
                }
            }
                
        }
        
        
        System.out.println(bfs());
        
        
    


    }

}


class Pair{
    public Pair(int x, int y){
        this.x = x; this.y = y;
    }
    int x;
    int y;
}

 

posted @ 2017-03-31 21:03  Gladitor  阅读(234)  评论(0编辑  收藏  举报