【kuangbin计划】专题一:简单搜索(6 / 14)

文章介绍了使用深度优先搜索(DFS)和广度优先搜索(BFS)解决不同类型的最短路径问题,包括棋盘问题、地牢大师游戏的三维BFS求最短路径、一维BFS求最短路以及递推和翻转等算法。这些例子展示了DFS和BFS在解决路径问题上的效率和适用场景。

目录

1114. 棋盘问题 - dfs按行枚举

1096. 地牢大师 - 三维bfs求最短路

1100. 抓住那头牛 - 一维bfs求最短路

为什么bfs可以求最短路?

4218. 翻转 - 递推 

4219. 找倍数 - dfs按位枚举 / bfs

1、dfs 

2、bfs

4220. 质数路径 - bfs求最短路


1114. 棋盘问题 - dfs按行枚举

1114. 棋盘问题 - AcWing题库

题目:

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别

要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案数目 

思路:

  • 类似与n皇后问题,我们用dfs按行枚举 ,即每行放一个,我们只需要看这一行每一列是否被占即可
  • 从第0行开始枚举,num记录已放好的棋子
  • 在第i行枚举所有列j,如果该位置为棋盘区域且该列未被标记,则标记好
  • 递归进入下一行,num+1
  • 因为要枚举所有情况,因此dfs完要还原现场
  • 要注意:因为棋子个数可能≤行数,因此有的行可以不放
import java.util.*;

class Main
{   
    static int N=10;
    static char[][] g=new char[N][N];
    static int[] col=new int[N]; //按行枚举 因此只需要看每列是否被占用即可
    static int res,n,k;
    
    public static void dfs(int x,int num)
    {
        if(num==k)  //当棋子全部摆好
        {
            res++;
            return;
        }
        if(x>=n) return; //越界
        
        dfs(x+1,num); //可以这一行不放
        
        for(int i=0;i<n;i++)
            if(g[x][i]=='#'&&col[i]==0)
            {
                col[i]=1;
                dfs(x+1,num+1);
                col[i]=0;
            }
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        while(true)
        {
            n=sc.nextInt();
            k=sc.nextInt();
            if(n==-1&&k==-1) break;
            
            Arrays.fill(col,0);
            
            for(int i=0;i<n;i++) 
            {
                String s=sc.next();
                for(int j=0;j<n;j++) g[i][j]=s.charAt(j);
            }
            
            res=0;
            dfs(0,0); //从第0行开始dfs,摆好了0个棋子
        
            System.out.println(res);
        }
    }
}

1096. 地牢大师 - 三维bfs求最短路

1096. 地牢大师 - AcWing题库

题目:

你现在被困在一个三维地牢中,需要找到最快脱离的出路!

地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过

向北,向南,向东,向西,向上,向下移动,移动一个单元距离均需要一分钟。

你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围

可以逃脱输出最短逃生时间,否则输出Trapped!

思路:

采用三维数组跑一个bfs即可

import java.util.*;

class Main
{
    static class Point
    {
        int x,y,z;
        public Point(int x,int y,int z)
        {
            this.x=x;
            this.y=y;
            this.z=z;
        }
    }
    
    static int N=110;
    static char[][][] g=new char[N][N][N]; //长 宽 高
    static int[][][] flag=new int[N][N][N];
    static int[][][] dist=new int[N][N][N];
    static int[] dx={1,-1,0,0,0,0},dy={0,0,-1,1,0,0},dz={0,0,0,0,1,-1};
    static Point st,ed;
    static int l,r,c;
    
    public static int bfs()
    {
        for(int i=0;i<110;i++)
            for(int j=0;j<110;j++)
            {
                Arrays.fill(dist[i][j],-1);
                Arrays.fill(flag[i][j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值