目录
1114. 棋盘问题 - dfs按行枚举
题目:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别
要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 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求最短路
题目:
你现在被困在一个三维地牢中,需要找到最快脱离的出路!
地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过
向北,向南,向东,向西,向上,向下移动,移动一个单元距离均需要一分钟。
你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围
可以逃脱输出最短逃生时间,否则输出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

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

被折叠的 条评论
为什么被折叠?



