迷宫救人——DFS小题

原创

题目大意:人质被困在迷宫之中,要求你寻找一条最短路径快速找到人质。

如图,人质在黄色点2处,营救者在起点红色处,1表示无法通过的障碍点,寻找一条最短路径快速找到人质。

毫无疑问用DFS,遍历4个方向,比较每条可以找到人质的路径即可得到答案。

 1 import java.util.Scanner;
 2 
 3 public class Maze_rescue {
 4     
 5     static int n;    //
 6     static int m;    //
 7     static int min=99999;
 8     static int maze[][];
 9     static int flag[][];    //1代表已走过
10     static int dir[][]= {{0,1},{1,0},{0,-1},{-1,0}};    //右、下、左、上
11     
12     static void dfs(int x,int y,int step) {    //step代表步数
13         if(maze[x][y]==2) {    //找到人质
14             if(step<min) {
15                 min=step;
16             }
17             return;
18         }
19         for(int i=0;i<4;i++) {
20             int dx=x+dir[i][0];
21             int dy=y+dir[i][1];
22             if(dx<0 || dy<0 || dx>=n || dy>=m) {    //越界
23                 continue;
24             }
25             if(maze[dx][dy]==1 || flag[dx][dy]==1) {    //判断是否障碍点或已走过点
26                 continue;
27             }
28             flag[dx][dy]=1;    //标志此点已经走过
29             dfs(dx,dy,step+1);
30             flag[dx][dy]=0;    //回溯
31         }
32     }
33     
34     public static void main(String[] args) {
35         
36         Scanner reader=new Scanner(System.in);
37         n=reader.nextInt();
38         m=reader.nextInt();
39         maze=new int[n][m];    //编号从(0,0)开始
40         flag=new int[n][m];    //标记路径的数组
41         flag[0][0]=1;    //起点不算入步数
42         for(int i=0;i<n;i++) {    //建造迷宫,0表示空地,1表示障碍,2代表人质点
43             for(int j=0;j<m;j++) {
44                 maze[i][j]=reader.nextInt();
45             }
46         }
47         dfs(0,0,0);
48         System.out.println(min);
49     }
50 
51 }
View Code

12:11:00

2018-07-15

转载于:https://www.cnblogs.com/chiweiming/p/9313164.html

程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试数据】 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值