N皇后问题是给定一个N*N的棋盘,要将N个棋子放入这个棋盘中,但要规定每个皇后不能放在同一行,同一列,也不能放在同一对角线上,问总共有多少中放法。
对于N皇后问题,我们大多数采用的是DFS+剪枝求解。
思路如下:
1)考虑一个棋子能否放在(i,j),那么第i行,第j列不能放有其他棋子容易判断的,而对角线怎么判断呢,设某个点(r,c)放有一个棋子,那么只要|i-r| != |j-c|就行。
2)我们定义一个数组a,a[i] = j表示第i行的第j列放了一个皇后。
3)我们从第一行往最后一行放,对于每一行的点,我们去判断这个是否能放,注意一定是判断前面已经放过皇后的行。如果不能放,那么判断这一行的下一个点,如果能放,那么就继续下一行(这里应该就是一个剪枝),知道所有行全部判断完为止。
具体实现代码如下:

#include <bits/stdc++.h>

using namespace std;

int a[10] = {
   0};
int ans = 0,n;
bool check(int r,int c){
   
	for(int i = 0; i < r; i++){
   
		if(a[i] == c || abs(a[i] - c) == abs(i - r))
		    return false;
	}
	return true;
}

void dfs(int r){
   
	if(r == n){
   
		ans++;
		return;
	}
	for(int i = 0; i < n; i++){
   
		if(check(r,i)){
   
			a[r] = i;
			dfs(r + 1);
		}
	}
}

int main(){
   
	cin >> n;
    dfs(0);
	cout << ans;	
	return 0;
}