n皇后问题(DFS做法)

问题描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
在这里插入图片描述
在这里插入图片描述

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的方案数。

示例1:

输入: 4
输出: 2

示例2:

输入: 8
输出: 92

解题思路

本题可用DFS来解决。
下面以4皇后问题为例:
4皇后DFS图解

本题可以用DFS来确定每一个皇后的位置,一行一行排,那么第n个皇后就排在第n行。第n个皇后能在第n行的1->n列选择一个位置。

需要注意的是:每个皇后(注意是每一个!)都不能在同一列,也不能在同一对角线。
那么如何保证这两点呢?首先,保证所有皇后不在同一列很好办,只要每次判断一下之前的皇后是否已经“占据”了这一列即可。其次,要保证不在同一对角线,棋盘其实就是矩阵,每一个位置都是一个坐标,我们可以通过横纵坐标之差来判断是否在同一对角线上。如果两个皇后横坐标之差的绝对值等于纵坐标之差的绝对值,那么这两个皇后就在同一对角线上。

 

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int lie[1005];
int ct=0;
void DFS(int x,int y);//表示 第x个皇后此时在第x行y列 
int main()
{
	scanf("%d",&n);
	DFS(0,0);
	printf("%d",ct);
}
void DFS(int x,int y)//表示 第x个皇后此时在第x行y列 
{
	if(x==n)
	{
		ct++;
		return;//别忘记回溯 
	}
	for(int i=1;i<=n;i++)
	{
		if(x+1==1)
		{
			lie[x+1]=i;
			DFS(x+1,i);
		}
		else
		{
			int j;
			for(j=x;j>=1;j--)
			{		
				lie[x+1]=i;//别忘记 
				if(abs(x+1 - j)==abs(lie[x+1] - lie[j])||lie[x+1]==lie[j])
					break;
			}
			if(j==0)
			{
				DFS(x+1,i);
			}
		}
	}
}

首篇原创博文,希望大家多多支持!

posted @ 2021-02-23 14:40  Syc5201102g  阅读(13)  评论(0编辑  收藏  举报