Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 361|回复: 0

Java:深度优先搜索(DFS)解决纸牌问题以及迷宫最短路径问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-18 10:52:16 | 显示全部楼层 |阅读模式

    一.纸牌问题

    /*
    * 有n个盒子排成一行
    * 有n张牌,上面数字分别为1-n
    * 将这n张牌放入n个盒子有多少种放法
    */

     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 }

    执行结果:

    二.迷宫最短路径

    5*5迷宫初始化如下

    0 0 1 0 1

    0 0 0 0 1

    0 0 1 0 0

    0 1 0 0 1

    0 0 0 0 1

    初始位置在(0,0)处,欲到达(3,2)处最少需要走多少步

    代码如下:

     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 }

    执行结果:

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-3 08:49 , Processed in 0.057316 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表