华为OJ——迷宫问题

来源:互联网 发布:数据库表主键的作用 编辑:程序博客网 时间:2024/05/23 01:21

题目描述

  定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:

int maze[5][5] = {

    0, 1, 0, 0, 0,    0, 1, 0, 1, 0,    0, 0, 0, 0, 0,    0, 1, 1, 1, 0,    0, 0, 0, 1, 0,

};

  它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

  • Input

      一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
      

  • Output

     左上角到右下角的最短路径,格式如样例所示。
     

  • Sample Input
      0 1 0 0 0
      0 1 0 1 0
      0 0 0 0 0
      0 1 1 1 0
      0 0 0 1 0
      

  • Sample Output

      (0, 0)
      (1, 0)
      (2, 0)
      (2, 1)
      (2, 2)
      (2, 3)
      (2, 4)
      (3, 4)
      (4, 4)

  • 输入描述:

      输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
      

  • 输出描述:

      左上角到右下角的最短路径,格式如样例所示。

  • 示例1

     输入

      5 5
      0 1 0 0 0
      0 1 0 1 0
      0 0 0 0 0
      0 1 1 1 0
      0 0 0 1 0

     输出

      (0,0)
      (1,0)
      (2,0)
      (2,1)
      (2,2)
      (2,3)
      (2,4)
      (3,4)
      (4,4)

代码实现:

  • 思路:

    ①首先分析,最佳路径只有一条,而且若不考虑,点往回走的情况,实际路径只有一条
    ②只需要一行一行的找符合条件的点即可

package cn.c_shuang.demo43;import java.util.LinkedHashMap;import java.util.Map;import java.util.Scanner;/** * 迷宫问题 * @author Cshuang * */public class Main {     public static void main(String[] args){            Scanner in = new Scanner(System.in);            while(in.hasNext()){                int n=in.nextInt();                int m=in.nextInt();                int[][]maze=new int[n][m];                for (int i = 0; i < n; i++) {                    for (int j = 0; j < m; j++) {                        maze[i][j]=in.nextInt();                    }                }                findBestWay(maze);            }            in.close();        }    private static void findBestWay(int[][] maze) {        Map<Integer, Integer> map=new LinkedHashMap<Integer, Integer>();        map.put(0, 0);        for (int i = 0; i < maze.length; i++) {            for (int j = 0;j < maze[i].length; j++) {                if(i==0&&j==0){                    System.out.println("("+i+","+j+")");                    continue;                }                if(maze[i][j]==0){//不能else maze[i][j]!=0的情况,因为,这样会出问题。                    //判断当前点的相邻点是否已输出(即为上一个路径零点)                    if((map.containsKey(i-1)&&map.get(i-1)==j||map.containsKey(i)&&map.get(i)==j-1)){                        map.put(i, j);//map会被覆盖,但是我只需要它存储上以个值,即可                        System.out.println("("+i+","+j+")");                    }                }            }        }    }}
原创粉丝点击