1. 程式人生 > >迷宮救人——DFS小題

迷宮救人——DFS小題

dir size 數組 str close closed -s src 題目

原創

題目大意:人質被困在迷宮之中,要求你尋找一條最短路徑快速找到人質。

技術分享圖片

如圖,人質在黃色點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

迷宮救人——DFS小題