华为OJ——迷宫问题

题目描述

  定义一个二维数组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+")");
                    }
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值