华为机试-迷宫问题

来源:互联网 发布:高中网上听课软件 编辑:程序博客网 时间:2024/05/26 05:53

题目描述
定义一个二维数组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表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

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

输入例子:
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)


代码


import java.util.Scanner;import java.util.Stack;public class Maze {    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner sc=new Scanner(System.in);        while(sc.hasNext())        {            int m=sc.nextInt(),n=sc.nextInt();            int a[][]=new int[m][n];            for(int i=0;i<m;i++)                for(int j=0;j<n;j++)                {                    a[i][j]=sc.nextInt();                }                   leastRoute(m,n,a);        }        sc.close();    }    public static void leastRoute(int m,int n,int a[][])    {        Node start=new Node(0,0);        Stack<Node> stack=new Stack<Node>();        stack.push(start);        int[][] visited = new int[m][n];//标记是否被访问,这个要和Map大小对应        int[][] dir = {{1, 0}, {0, 1}};//定义两个方向横着走或者竖着走(题目中说只走这两个方向,当前也可以定义多个方向)        while (!stack.isEmpty()) {             boolean flag = false;//标记是否找了一个方向             Node pek = stack.peek();//获取栈顶元素,注意不需要出栈             if (pek.x == m-1 && pek.y == n-1) {//如果到达目的地则跳出循环                 break;             } else {                 for (int i = 0; i < 2; i++) {//循环两个方向                     Node nbr = new Node(pek.x + dir[i][0], pek.y + dir[i][1]);//找到当前位置的邻居位置坐标并判断是否合法                     if (nbr.x >= 0 && nbr.x < m && nbr.y >= 0 && nbr.y < n && a[nbr.x][nbr.y] == 0 && visited[nbr.x][nbr.y] == 0) {//判断邻居节点是否合法                         stack.push(nbr);//合法将邻居位置加入栈                         visited[nbr.x][nbr.y] = 1;//并标记该节点已经访问                         flag = true;//找到了一个方向                         break;//找到了就停止循环,顺着这个方向一直搜索                     }                 }                 if (flag) {//找到了方向,就不用执行下面的出栈,沿着这个方向一直搜下去                     continue;                 }                 stack.pop();//如果两个方向都不能通过,则出栈。             }        }         Stack<Node> stkRev = new Stack<Node>();//将路径反过来,因为栈中输出的路径是反的         while (!stack.isEmpty()) {             stkRev.push(stack.pop());         }         while (!stkRev.isEmpty()) {              System.out.println("(" + stkRev.peek().x + "," + stkRev.peek().y + ")");             stkRev.pop();         }    }}class Node {        int x, y;        public Node(int x, int y) {            this.x = x;            this.y = y;        }    }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 物业对高空抛物怎么办 如果法官不公平判案我该怎么办? 民事案夸省审理案件不公平怎么办 积目头像未通过审核怎么办 电压不稳空调带不动怎么办 孩子吃了塑料珠怎么办 美的电压力锅打不开盖子怎么办 瓶盖打不开怎么办 瓶子是玻璃的 杯子口关错位了怎么办 大玻璃瓶的玻璃瓶盖拧不开怎么办 按压式洗发水瓶盖打不开怎么办 向下按压的瓶盖打不开怎么办 玻璃罐头开过了打不开怎么办 玻璃瓶的塑料盖子打不开怎么办 泡酒玻璃瓶盖子打不开怎么办 罐头的塑料瓶盖打不开怎么办 塑料水杯盖紧了怎么办 拧不开矿泉水瓶盖怎么办 新暖壶盖吸住了怎么办 暖瓶盖被吸住了怎么办 做面包和面粘手怎么办 面包面和稀了怎么办 鱼缸氧气泵声音大怎么办 中班安全遇到火灾怎么办反思 汤洒了怎么办活动反思 下水道被塑料盖堵了怎么办 卫生间地漏盖子掉到下水道怎么办 洗手池下水道翻盖打不开了怎么办 培乐多彩泥吃了怎么办 超轻橡皮泥干了怎么办 脑梗脾气大怎么办好啊 牙齿喝饮料烂了怎么办 大门牙缝里黑了怎么办 椰汁拧不开瓶盖怎么办 装蜂蜜的玻璃罐打不开怎么办 蚂蚱没有草吃了怎么办 笔记本电源已接通未充电怎么办 电源已接通未充电怎么办 遮盖纹身好了颜色淡了怎么办 致炫方向盘变重怎么办 xp音频图标没了怎么办