走迷宫

来源:互联网 发布:linux 删除文件夹函数 编辑:程序博客网 时间:2024/05/01 10:33
package com.supermars.practice;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class 走迷宫 {
    /*no
    1为空地
    0为障碍物
    input
    1 1 0 1 1
    1 0 1 1 1
    1 0 1 0 0
    1 0 1 1 1
    1 1 1 0 1
    1 1 1 1 1
    */
    final static int MAXN = 1 << 7;
    static int maze[][] = new int[MAXN][MAXN]; // 迷宫数据
    static int vis[][] = new int[MAXN][MAXN]; // 访问标记
    static int fa[][] = new int[MAXN][MAXN]; // 父节点编号
    static int dist[][] = new int[MAXN][MAXN]; // 最短距离
    static int last_dir[][] = new int[MAXN][MAXN]; // 父节点移动方向
    static int dir[] = new int[MAXN*MAXN];
    
    static int dx[] = { -1, 1, 0, 0 }, dy[] = { 0, 0, -1, 1 };
    static int q[] = new int[MAXN * MAXN];

    static int n, m;

    public static void main(String[] args) throws FileNotFoundException {
        Scanner cin = new Scanner(
                new File(
                        "E:\\jspWorkspace\\programArithmetic\\src\\com\\supermars\\practice\\in.txt"));
        int i = 0, j = 0;
        while (cin.hasNext()) {
            String s = cin.nextLine();
            String sa[] = s.split(" ");
            j = 0;
            while (j < sa.length)
                maze[i][j] = Integer.valueOf(sa[j++]);
            i++;

        }
        n = i;
        m = j;
        i = 0;
        j = 0;
        bfs(i, j);
        //System.out.println("bfs -> print_path");
        print_path_1(i,j);

    }

    private static void print_path(int x, int y) {
        int fx=fa[x][y]/m;
        int fy=fa[x][y]%m;
        if(fx!=x || fy!=y){
            print_path(fx,fy);
            System.out.print(last_dir[x][y]+" ");
        }    
    }
    private static void print_path_1(int x, int y) {
        int c=0;
        while(true){
            int fx=fa[x][y]/m;
            int fy=fa[x][y]%m;
            if(fx==x && fy==y)break;
            dir[c++]=last_dir[x][y];
            x=fx;
            y=fy;
        }
        int i=0;
        while(i<c){
            System.out.print(dir[i++]+" ");
        }
        
    }

    private static void bfs(int x, int y) {
        /*
         * coding: u(x,y)=x*m+y vis fa=u dist=0 q[rear++]=u loop(nx,ny-ok->q[rear++]=v vis fa dist
         * last_dir)
         */
        int front = 0, rear = 0, d, u;
        u = x * m + y;
        vis[x][y] = 1;fa[x][y] = u;dist[x][y] = 0;
        q[rear++] = u; // 放入访问序列
        while (front < rear) {
            u = q[front++]; // bfs访问首节点
            x = u / m;y = u % m; // 首节点的位置(x,y)
            for (d = 0; d < 4; d++) { // 节点周边访问
                int nx = x + dx[d], ny = y + dy[d]; // 产生新的节点
                if (nx >= 0 && nx < n && ny >= 0 && ny < m && (maze[nx][ny] == 1)
                        && (vis[nx][ny] == 0)) {
                    int v=nx*m+ny;
                    q[rear++]=v;     //加入新节点编号到序列
                    vis[nx][ny]=1;
                    fa[nx][ny]=u;
                    dist[nx][ny]=dist[x][y]+1;
                    last_dir[nx][ny]=d;  //方向UDLR=1234
                }
            }
        }
    }
}

0 0
原创粉丝点击