1 package DFSearch;
2
3 import java.util.Scanner;
4 /*
5 * 有n个盒子排成一行
6 * 有n张牌,上面数字分别为1-n
7 * 将这n张牌放入n个盒子有多少种放法
8 */
9 public class PlayCards {
10 static int n;
11 static int[] a = new int[10];
12 static int[] book = new int[10];
13 public static void main(String[] args){
14 @SuppressWarnings("resource")
15 Scanner scan = new Scanner(System.in);
16 n = scan.nextInt();
17 dfs(1);
18 return;
19 }
20 public static void dfs(int step){
21 //递归完成的结束条件
22 //如果站在第n+1个盒子前,则放置完成
23 if(step==n+1){
24 //输出放置的顺序
25 for(int i=1;i<=n;i++){
26 System.out.print(a+" ");
27 }
28 System.out.println();
29 //必须要有return,出递归
30 return;
31 }
32 //面对第step个盒子,从牌1遍历下去,如果发现还在手中则放入盒子,标记,接着递归,再次标记返回上一层递归
33 for(int i=1;i<=n;i++){
34 if(book==0){
35 a[step] = i;
36 book = 1;
37 dfs(step+1);
38 book = 0;
39 }
40 }
41 return;
42 }
43 }
1 package DFSearch;
2
3 import java.util.Scanner;
4
5 public class FindPath {
6 //人质所在迷宫的位置
7 static int fx,fy;
8 //迷宫为5*5
9 static int n=5;
10 //上下左右移动
11 static int[][] temp ={{0,1},{1,0},{0,-1},{-1,0}};
12 //迷宫数组
13 static int [][] squera = new int [n][n];
14 //标记数组,走过就标记为1
15 static int [][] book = new int [n][n];
16 //最短步数
17 static int min = 9999999;
18 public static void main(String[] args){
19 @SuppressWarnings("resource")
20 Scanner scan = new Scanner(System.in);
21
22 System.out.println("请输入迷宫5*5:");
23 for(int i=0;i<n;i++){
24 for(int j=0;j<n;j++){
25 squera[j] = scan.nextInt();
26 }
27 }
28 System.out.println("请输入人质所在位置:");
29 fx = scan.nextInt();
30 fy = scan.nextInt();
31 book[0][0] = 1;
32 dfs(0,0,0);
33 System.out.println(min);
34 /*for(int i=0;i<5;i++){
35 for(int j=0;j<5;j++){
36 if(book[j]==1){
37 System.out.println("<"+i+","+j+">->");
38 }
39 }
40 }*/
41 }
42 public static void dfs(int x,int y,int step){
43 //如果到达地点,结束
44 if(x==fx&&y==fy){
45 if(step<min){
46 min = step;
47 }
48 return;
49 }
50 //循环移动到四个方向
51 for(int i=0;i<4;i++){
52 int tx = temp[0];
53 int ty = temp[1];
54 //如果该方向越界了,改变到另一个方向
55 if(x+tx<0||x+tx>=n)
56 continue;
57 if(y+ty<0||y+ty>=n)
58 continue;
59 //如果该位置没有障碍物并且也没有走过,走
60 if(squera[x+tx][y+ty]==0 && book[x+tx][y+ty]==0){
61 //标记为走过
62 book[x+tx][y+ty] = 1;
63 //搜索过程
64 //System.out.println(""+(x+tx)+","+(y+ty)+"->");
65 //往下一层递归
66 dfs(x+tx,y+ty,step+1);
67 //取消标记,回到上一层
68 book[x+tx][y+ty] = 0;
69 }
70 }
71 return;
72 }
73 }