• 蓝桥杯 第十届 JAVAB组 E迷宫


    /*试题 E: 迷宫    本题总分:15 分
    【问题描述】
    下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可
    以通行的地方。
    010000
    000100
    001001
    110000
    迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这
    个它的上、下、左、右四个方向之一。
    对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,
    一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。
    对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式,
    其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
    请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务
    必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 maze.txt,
    内容与下面的文本相同)
    01010101001011001001010110010110100100001000101010
    00001000100000101010010000100000001001100110100101
    01111011010010001000001101001011100011000000010000
    01000000001010100011010000101000001010101011001011
    00011111000000101000010010100010100000101100000000
    11001000110101000010101100011010011010101011110111
    00011011010101001001001010000001000101001110000000
    试题E: 迷宫 7
    第十届蓝桥杯大赛软件类省赛 Java 大学 B 组
    10100000101000100110101010111110011000010000111010
    00111000001010100001100010000001000101001100001001
    11000110100001110010001001010101010101010001101000
    00010000100100000101001010101110100010101010000101
    11100100101001001000010000010101010100100100010100
    00000010000000101011001111010001100000101010100011
    10101010011100001000011000010110011110110100001000
    10101010100001101010100101000010100000111011101001
    10000000101100010000101100101101001011100000000100
    10101001000000010100100001000100000100011110101001
    00101001010101101001010100011010101101110000110101
    11001010000100001100000010100101000001000111000010
    00001000110000110101101000000100101001001000011101
    10100101000101000000001110110010110101101010100001
    00101000010000110101010000100010001001000100010101
    10100001000110010001000010101001010101011111010010
    00000100101000000110010100101001000001000000000010
    11010000001001110111001001000011101001011011101000
    00000110100010001000100000001000011101000000110011
    10101000101000100010001111100010101001010000001000
    10000010100101001010110000000100101010001011101000
    00111100001000010000000110111000000001000000001011
    10000001100111010111010001000110111010101101111000
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个字符串,包含四种字母 D、U、L、R,在提交答案时只填写这个字符串,填
    写多余的内容将无法得分。*/

     解题思路:

     1、广度优先搜索:遍历从起点到终点 每一个点到重点的最短距离 逆向搜索

     2、深度优先搜索:根据广度优先搜索的预处理,深度搜索一条最短的路径

    答案正确

    import java.util.*;
    public class E5{
        static int n,m;
        static char[][] maze;
        static int[][] dis;
        static int[][] dir = {{1 ,0},{0,-1 },{0,1 },{-1 ,0}};
        static char[] c = {'D','L','R','U'};
        
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            Queue<Integer> queue = new LinkedList<Integer>();
            dis = new int[30][50];
            maze = new char[30][50];
            
            n = scanner.nextInt();
            m = scanner.nextInt();
            
            for(int i=0;i<n;i++) {
                String string = scanner.next();
                for(int j=0;j<m;j++)
                    maze[i][j] = string.charAt(j);
            }
    
        
            queue.add((n-1 )*m+m-1 );
            
            while(!queue.isEmpty()) {
                int  temp = queue.poll();
                for(int i=0;i<4;i++) {
                    int xx = temp/m + dir[i][0];
                    int yy = temp%m + dir[i][1 ];
                    if(xx<0||xx>=n||yy<0|yy>=m||maze[xx][yy]=='1'||dis[xx][yy]!=0) continue;   //注意这里dis[n-1 ][m-1 ]=0,但是已经遍历过了
                    System.out.println(xx+" "+yy);
                    queue.add(xx*m+yy);
                    dis[xx][yy] = dis[temp/m][temp%m] + 1 ;
                    if(xx==0&&yy==0) break;
                }
            }
            dis[n-1 ][m-1 ] = 0;  //由于遍历不止一遍,所以值不是0,要在定义一遍
        
            String record="";
            int x = 0,y = 0;
                    
            while(x!=n-1 ||y!=m-1 ) {
                for(int i=0;i<4;i++) {
                    int xx = x + dir[i][0];
                    int yy = y + dir[i][1 ];
                    if(xx<0||xx>=n||yy<0|yy>=m||maze[xx][yy]=='1') continue;
                    if(dis[x][y]==dis[xx][yy]+1 ) {
                        x = xx; y = yy;
                        record += c[i];
                        break;
                    }
                }
            }
            System.out.println(record.length());
            System.out.println(record);
        }
    }
    //DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUUL
    //ULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR

    最短路径-->BFS

     记录路径--> 结构体中String存储路径 

    答案错误

    import java.util.*;
    
    public class Main{
        static class node{
            int x;
            int y;
            String path;
            public node(int x,int y,String path) {
                this.x = x;
                this.y = y;
                this.path = path;
            }
        }
        
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            
            Queue<node> queue = new LinkedList<node>();
            int[][] dir = {{0 ,1 },{0 ,-1 },{-1 ,0 },{1 ,0 }};
            char[] c = {'R','L','U','D'};
            int[][] maze = new int[30 ][50 ];
    
            
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            for(int i=0 ;i<n;i++)
                for(int j=0 ;j<m;j++)
                    maze[i][j] = scanner.nextInt();
    
            maze[0 ][0 ] = 1 ;
            queue.add(new node(0 , 0 , ""));
            
            while(!queue.isEmpty()) {
                node temp = queue.poll();
                for(int i=0 ;i<4;i++) {
                    int xx = temp.x + dir[i][0 ];
                    int yy = temp.y + dir[i][1 ];
                    if(xx<0 ||xx>=n||yy<0 ||yy>=m||maze[xx][yy]==1 ) continue;
                    maze[xx][yy] = 1 ;
                    queue.add(new node(xx, yy, temp.path+c[i]));
                    if(xx==n-1 &&yy==m-1 )  
                        System.out.println(temp.path+c[i]);
                }
            }
           
        }
    }
     
  • 相关阅读:
    [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)
    [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
    [bzoj1006](HNOI2008)神奇的国度(弦图最小染色)【太难不会】
    [BZOJ1005](HNOI 2008)明明的烦恼
    unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010
    再议Unity 3D
    Android系统简介(中):系统架构
    Android系统简介(上):历史渊源
    Spread 之自定义对角线cellType源码: DiagonalCellType
    通信行业OSS支撑系统软件研发思考
  • 原文地址:https://www.cnblogs.com/Lemon1234/p/10598202.html
Copyright © 2020-2023  润新知