zoukankan      html  css  js  c++  java
  • Dfs+回溯迷宫问题1.1

    深度优先访问+回溯实现迷宫问题

    1为墙,0为可走的路,代码有注释。

    import java.util.Scanner;
    public class maze {
        //地图的大小
        //用来保存地图
        static int n = 6, m = 5, start_x, start_y, end_x, end_y;
        //n22 m21
    //    static int[][] map = {
    //            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    //            {1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1},
    //            {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
    //            {1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1},
    //            {1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
    //            {1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1},
    //            {1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1},
    //            {1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1},
    //            {1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
    //            {1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1},
    //            {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
    //            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
    
    ////    n=6,m=5
        static int[][] map = {
            {1,1,1,1,1},
            {1,0,0,0,1},
            {1,0,1,0,1},
            {1,0,1,0,1},
            {1,0,0,0,1},
            {1,1,1,1,1}};
        //用来保存是否被访问过
        static int[][] isVisited = new int[n][m];
        //记录所有可行路径下标
        static int[][] train = new int[2500][2];
        //遵循 左下右上 的顺序
        static int[][] path = {{0, -1},
                {1, 0},
                {0, 1},
                {-1, 0}};
        //记录所有到达的路径数量
        static int count;
        //记录走的步数,方便回溯打印
        static int k;
        //判断是否已经到达终点
        static int flag;
        static boolean f = false;
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            //输出地图
            System.out.println("地图的情况");
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
    //        System.out.println("(1,1)(1,19)可作为起点---(20,19)(20,3)可作为终点---也可另寻别路");
            //输入判断操作
            while (!f) {
                System.out.print("请输入起点坐标:");
                start_x = sc.nextInt();
                start_y = sc.nextInt();
                System.out.print("请输入终点坐标:");
                end_x = sc.nextInt();
                end_y = sc.nextInt();
                //判断要查询的起点和终点坐标 是否符合标准
                if (!isStandard(start_x, start_y)) {
                    System.out.println("输入的起点坐标有误~~~");
                } else if (!isStandard(end_x, end_y)) {
                    System.out.println("输入的终点坐标有误~~~");
                } else if (start_x == end_x && start_y == end_y) {
                    System.out.println("起点终点不能相同~~~");
                } else {
                    dfs(start_x, start_y);
                    if (count == 0) {
                        System.out.println("没路");
                    }
                    return;
                }
            }
    
        }
    
    
        //传进来起点坐标
        public static void dfs(int x, int y) {
            if (x == end_x && y == end_y) {
                count++;
                printPath();
                return;
            }
            for (int i = 0; i < path.length; i++) {
                //开始四个方向分别遍历
                int next_x = x + path[i][0];
                int next_y = y + path[i][1];
                isVisited[x][y] = 1;
                //判断是否符合标准
                if (isStandard(next_x, next_y)) {
                    isVisited[next_x][next_y] = 1;
                    train[k][0] = x;
                    train[k][1] = y;
                    k++;
                    //进行递归寻找下一个可行的路
                    dfs(next_x,next_y);
                    //若到了终点置零
                    isVisited[next_x][next_y] = 0;
                    k--;
                }
            }
        }
        //打印走过的路径
        public static void printPath() {
            for(int i = 0;i<=k-1;i++){
                System.out.print("[" + train[i][0] + "," + train[i][1] + "]"+"->");
            }
            System.out.print("[" + end_x + "," + end_y + "]");
            System.out.println();
        }
        //判断这个点是否符合标准
        static boolean isStandard(int x, int y) {
            if (x < n && x > 0 && y > 0 && y < m && map[x][y] == 0 && isVisited[x][y] == 0) {
                return true;
            }
            return false;
        }
    }
  • 相关阅读:
    bzoj 2730: [HNOI2012]矿场搭建
    bzoj 1179: [Apio2009]Atm
    strcpy,strlen, strcat, strcmp函数,strlen函数和sizeof的区别
    C语言printf的格式
    C语言中交换两个数值的方法
    C语言中 指针的基础知识总结, 指针数组的理解
    自定义方法实现strcpy,strlen, strcat, strcmp函数,了解及实现原理
    选择排序
    冒泡排序的优化
    storyBoard中取消键盘第一响应
  • 原文地址:https://www.cnblogs.com/tac2664/p/15667937.html
Copyright © 2011-2022 走看看