n皇后问题——深度优先搜索dfs

这篇博客通过代码展示了如何使用深度优先搜索(DFS)解决八皇后问题。文章详细解释了如何避免皇后在同一行、同一列或同一斜线上,并通过递归实现搜索。在每一步中,检查当前位置是否合适放置皇后,并进行标记以防止重复放置,最后输出所有可能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

dfs在之前也有讲过,有兴趣可以戳蓝字->dfs全排列

我们先画图模拟下过程吧(电脑画图不太会,手绘将就一下吧)

条件满足 

条件:任意两个皇后都不能处于同一行、同一列或同一斜线上

处理:

同一行:每次放完Q就处理下一行

同一列:用line[l]做标记

同一斜线:Q不放在dg[n-l+r] 和udg[l+r]

代码演示:

#include<iostream>
 
 using namespace std;
 
 const int N=10;
 //标记两条斜线上和列上对应的点是否有皇后 
 int dg[2*N],udg[2*N],line[N],n;
 char a[N][N];//用二维数组表棋盘 
 void dfs(int r)
 {
 	if(r==n)
 	{
 		for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<n;j++)
	 	{
	 		cout<<a[i][j];
		 }
		 cout<<endl;
	  } 
	  cout<<endl;
	  return; 
	 }
	 for(int l=0;l<n;l++)
	 {
	 	if(!dg[n-l+r]&&!udg[l+r]&&!line[l])
	 	{
	 		a[r][l]='Q';
	 		dg[n-l+r]=udg[l+r]=line[l]=1;
			 //标记对应的斜线和列上已经有了皇后 
			 dfs(r+1);//到下一行 
			 dg[n-l+r]=udg[l+r]=line[l]=0;//清除标记
			 a[r][l]='.';//重置棋盘 
		 }
	 }
 }
 int main()
 {
 	cin>>n;
 	for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<n;j++)
	 	{
	 		a[i][j]='.';
		 }
	  } 
	  dfs(0);
	  return 0;
 }

### 深度优先搜索 DFS 算法竞赛例题 #### 最大人工岛问题 在解决最大人工岛问题时,通过多次应用深度优先搜索来计算不同连通区域的面积并找到其中的最大者[^1]。每当遇到一个新的未访问过的陆地块,则启动一次新的DFS遍历过程,标记该区域内所有的相连陆地,并统计其总面积。 ```python def dfs(grid, i, j): if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j]!=1: return 0 r = 1 grid[i][j]=2 # mark as visited directions=[(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for d in directions: ni,nj=i+d[0],j+d[1] r += dfs(grid,ni,nj) return r def maxAreaOfIsland(grid): res=0 for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j]==1: area=dfs(grid,i,j) res=max(res,area) return res ``` #### 连通图与回溯算法的应用 另一个例子是在处理复杂连通性的场景下采用基于位置的搜索方法加上类似于八皇后的冲突检测机制来进行路径探索和状态空间树构建[^2]。这种方法适用于那些需要考虑多个因素相互影响的情况,比如棋盘上的布局优化等问题。 #### 山峰和山谷数量计算 针对特定地形特征识别的任务,如确定地图中的山峰和山谷数目,可以通过定义严格的条件并通过DFS实现高效查找[^3]。具体来说,对于每个网格单元,检查它是否满足成为山峰或山谷的标准——即四周的高度关系;一旦确认则继续深入相邻节点直到完成整个连通分量的扫描。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值