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

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

 

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;
 }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值