어떻게 JAVA 를 이용 하여 미로 프로그램 을 실현 합 니까?

본 Demo 는 세 가지 종 류 를 사용 합 니 다.
테스트 클래스
사용자 정의 Stack 클래스
사용자 정의 Queue 클래스
실현 가능 한 기능:
1.텍스트 파일 에 적 힌 미로 에 대해 서 는 2 차원 배열 로 전환 하여 가장 짧 은 경 로 를 찾 을 수 있 습 니 다.
2.미로 의 입구 와 출구 를 정의 하지 않 고 자동 으로 출입 구 를 찾 을 수 있 습 니 다.
전 제 는 대응 하 는 경로 의.txt 파일 이 있어 야 합 니 다.
여기 예 를 들 어 보 겠 습 니 다.저 는'F:/1 번 미로(0,18).txt'경로 에서

실행 결과

예제 코드
주석 을 매우 상세 하 게 썼 으 니,여 기 는 군말 이 많 지 않다.

package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

/**    
 * 1   (0,18).txt
 *2   (0,1).txt
 */
public class Test {
    public static void main(String[] args) throws Exception {
        Test test = new Test();
        //             
        char[][] arr = test.getFile("F:/1   (0,18).txt");
        System.out.println("        :"+arr[0].length);
        int deep = test.getDeepByChar(arr);
        System.out.println("        :"+deep);

        //      
        int [] begin = test.begin(arr);
        System.out.println("    :("+begin[0]+","+begin[1]+")");
        //      
        int [] end = test.end(arr,deep);
        System.out.println("    :("+end[0]+","+end[1]+")");
        System.out.println("=================================      ============================================");
        //      
        test.printArr(arr,deep);
        System.out.println("=================================       ===========================================");
        //      
        int[][] bfs = test.bfs(arr,begin,end,deep);
        for (int i = 0; i < deep; i++) {
            for (int j = 0; j < bfs[0].length; j++) {
                System.out.print(bfs[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("================================    ===============================================");
        //             
        int[][] result = test.getLoaderFromMap(bfs, begin, end, deep);
        //  result   
        int deep1 = test.getDeepByInt(result);
        for (int i = 0; i < deep1; i++) {
            System.out.println("("+result[i][0]+","+result[i][1]+")\t");
        }
    }

    //      
    public int[][] bfs(char [][] arr, int [] begin, int [] end,int deep) {
        //       
        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, 1, 0, -1};
        //d           
        int[][] d = new int [deep][arr[0].length];
        //          ,  LinkedList   Deque,Deque    Queue
        Queue1<int[]> que = new Queue1<>();
//        Queue<int []> que = new LinkedList<>();
        //             
        for(int i = 0; i < d.length; i++) {
            for(int j = 0; j < d[0].length; j++) {
                d[i][j] = -1;
            }
        }
        //        
        que.offer(begin);
        //          0
        d[begin[0]][begin[1]] = 0;
        //          
        while(!que.isEmpty()) {
            //          
            int [] current = que.poll();
            //        
            if(current[0] == end[0] && current[1] == end[1]){
                break;
            }
            //      
            for(int i = 0; i < 4; i++) {
                //  
                int nx = current[0] + dx[i];
                int ny = current[1] + dy[i];
                //       
                if(nx >= 0 && nx < deep && ny >= 0 && ny < d[0].length  && arr[nx][ny] == '0' && d[nx][ny] == -1) {
                    //     ,        1
                    d[nx][ny] = d[current[0]][current[1]] + 1;
                    //              
                    int[] c = {nx, ny};
                    que.offer(c);
                }
            }
        }
        return d;
    }

    //             
    private int [][] getLoaderFromMap(int [][] map,int [] begin,int [] end,int deep) {
        int k = 0;//   
        //              
        int[][] resultList = new int[map.length * map.length][2];
        //result             
        int[] result;
        //     ,           ,              
        Stack1<int[]> stack = new Stack1<>();
        //       
        stack.push(end);
        //       
        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, 1, 0, -1};
        //       ,       
        //             ,     
        while(true){
            //         ,   
            int[] current = stack.peek();
            for (int i = 0; i < 4; i++) {
                //  
                int nx = current[0] + dx[i];
                int ny = current[1] + dy[i];
                //            ,       
                if(map[current[0]][current[1]] != map[begin[0]][begin[1]]){
                    //       
                    if (nx >= 0 && nx < deep && ny >= 0 && ny < map[0].length && map[nx][ny] != -1) {
                        //      ,            1
                        if(map[nx][ny] == map[current[0]][current[1]]-1){
                            //     ,      
                            result = new int[]{nx, ny};
                            stack.push(result);
                        }
                    }
                }else{
                    k++;
                    break;
                }
            }
            //k          ,   map[current[0]][current[1]] != map[begin[0]][begin[1]] 
            //           ,       ,  while for     ,             
            if(k != 0){
                break;
            }
        }

        //        resultList
        int len = stack.length();
        for(int i = 0;i < len;i++){
            result = stack.pop();
            resultList[i][0] = result[0];
            resultList[i][1] = result[1];
        }
        return resultList;
    }

    //               
    private char[][] getFile (String pathName) throws Exception {
        File file = new File(pathName);
        //          
        if (!file.exists())
            throw new RuntimeException("Not File!");
        //       //       ,  new       
        BufferedReader br = new BufferedReader(new FileReader(file));
        //   str        
        String str;
        //         
        char[][] arr = new char[110][];
        //x         
        int x = 0;
        while ((str = br.readLine()) != null) {
            x++;
            //            
            char[] cArr = str.toCharArray();
            //               
            arr[x - 1] = cArr;
        }
        br.close();
        return arr;
    }

    //      
    private int[] begin ( char[][] arr){
        //       begin[0]=x,begin[1]=y
        int[] begin = new int[2];
        // StringBuffer        ,         
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < arr[0].length; i++) {
            s.append(arr[0][i]);
        }
        //        
        //        
        if (s.indexOf("0") != -1) {
            begin[0] = 0;
            begin[1] = s.indexOf("0");
            return begin;
        } else {
            //        
            for (int i = 0; i < arr.length; i++) {
                if (arr[i][0] == '0') {
                    begin[0] = i;
                    begin[1] = 0;
                    return begin;
                }
            }
        }
        return begin;
    }

    //      
    private int[] end ( char[][] arr, int deep){
        //       end[0]=x,end[1]=y
        int[] end = new int[2];
        //             //18        
        for (int i = 0; i < deep; i++) {
            //         
            if (arr[i][arr[0].length - 1] == '0') {
                end[0] = i;
                end[1] = arr[0].length - 1;
                return end;
            }
        }
        //        
        for (int i = 0; i < arr.length; i++) {
            //             //deep        
            if (arr[deep - 1][i] == '0') {
                end[0] = deep - 1;
                end[1] = i;
                return end;
            }
        }
        return end;
    }

    /**
     *                 110,        110,                   
     *             ,                    ,           
     *      ,                    
     */
    //          
    private int getDeepByChar ( char[][] arr){
        int y = 0;//  
        for (int i = 0; i < arr.length; i++) {
            //  i    , i           ,    y 
            try {
                //           1 0,       
                if (arr[i][0] != '1' && arr[i][0] != '0') {
                    break;
                }
            } catch (Exception e) {
                return y;
            }
            y++;
        }
        return y;
    }

    //            
    private int getDeepByInt ( int[][] arr){
        int y = 0;//  
        for (int i = 0; i < arr.length; i++) {
            //    (0,0) ,      
            if (arr[i][0] == 0 && arr[i][1] == 0) {
                break;
            }
            y++;
        }
        return y;
    }

    //      
    private void printArr ( char[][] arr, int deep){
        for (int i = 0; i < arr[0].length; i++) {
            for (int j = 0; j < deep; j++) {
                try {
                    System.out.print(arr[i][j] + "\t");
                } catch (Exception e) {
                }
            }
            System.out.println();
        }
    }
}

/**
 *   
 * @param <E>
 */
class Queue1<E> {
    private E[] arr;//          
    private int size;//size           
    private int putIndex=-1;//putIndex                 ,         arr[0]

    //    
    protected Queue1(int initSize){
        if(initSize < 0){
            throw new IllegalArgumentException("    ");
        }
        arr = (E[])new Object[initSize];
        size = 0;
    }
    //    ,  10     
    protected Queue1(){
        this(110);
    }

    //  
    protected void offer(E e){
        if(size == arr.length) {
            throw new ArrayIndexOutOfBoundsException("    push  ,    ");
        }
        arr[++putIndex] = e;
        size++;
    }

    //        
    protected boolean isEmpty(){
        return size == 0?true:false;
    }

    //  
    protected E poll() {
        if (size == 0) {
            throw new ArrayIndexOutOfBoundsException("This queue is empty!      ");
        }
        E tmp = arr[0];
        //         
        for (int i = 0; i < size - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr[size - 1] = null;
        putIndex--;
        size--;
        return tmp;
    }
}

/**
 *  
 * @param <E>
 */
class Stack1<E> {
    private int maxSize;//    
    private int top = -1;//    ,    -1
    private E[] data;//         

    //      
    protected Stack1(int maxSize){
        if(maxSize > 0){
            this.maxSize = maxSize;
            //data           
            data = (E[])new Object[maxSize];
        }else{
            throw new IllegalArgumentException("        ,     ");
        }
    }

    //        10
    protected Stack1(){
        //      ,  10
        this(10);
    }

    //  
    protected boolean push(E e){
        //        
        if(top == maxSize-1){
            //  
            this.resize();
        }
        // top++, top = e
        data [++top] = e;
        return true;
    }

    //       
    protected boolean isEmpty(){
        return top == -1;
    }

    //      
    protected int length(){
        return top+1;
    }
    //  
    protected E pop(){
        //        
        if(top == -1){
            throw new IllegalArgumentException("     ");
        }
        else{
            E e = data[top];
            // top = null, top--
            data[top--] = null;
            return  e;
        }
    }

    //      
    protected E peek(){
        //        
        if(top == -1){
            throw new IllegalArgumentException("     ");
        }else{
            return data[top];
        }
    }

    //   ,          
    protected void resize(){
        int newSize = maxSize*2;
        E[] newData = (E[])new Object[newSize];
        for (int i = 0;i < data.length;i ++){
            newData[i] = data[i];
        }
        //      
        maxSize = newSize;
        //  newData   data  
        data = newData;
    }
}
총결산
JAVA 를 이용 하여 미로 프로그램 을 어떻게 실현 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 JAVA 미로 프로그램 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기