目录
N皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后之间不能相互攻击到彼此,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数 n,请你输出所有的满足条件的棋子摆法,以及一共有多少种能够满足条件的棋子摆法。
数据范围
1<=n<=20
分析
B站上关于N皇后问题的求解视频:
C++代码(递归回溯法)
#include<iostream>
using namespace std;
#define Max 20 //定义棋盘的最大值
#define MaxCount 1000 //定义最大的结果个数
int N;
int direction_x[8] = {0, 1, 1, 1, 0, -1, -1, -1}, direction_y[8] = {1, 1, 0, -1, -1, -1, 0, 1}; //控制8个方向
char queen[Max][Max]; //皇后位置棋盘
int attack[Max][Max]; //皇后可攻击状态棋盘
char solve[MaxCount][Max][Max]; //存储N皇后问题的全部解法
int solve_count = 0; //solve数组的第一维
/* 定义函数put_queen(),实现在(x,y)处放置皇后,对attack数组进行更新 */
void update_attack(int attack[][Max], int x, int y)
{
attack[x][y] = 1; //先将皇后所在位置(x,y)处置为1,表示不可再放置皇后
int nx,ny;
//通过两层循环,将该皇后可能攻击到的位置进行标记
for(int l=1; l<N; l++) //从皇后位置向1~N-1个距离延伸
{
for(int k=0; k<8; k++) //8个方向
{
nx = x + l * direction_x[k];
ny = y + l * direction_y[k];
if(nx>=0 && nx<N && ny>=0 && ny<N) //不越界
{
attack[nx][ny] = 1; //可以被皇后攻击
}
}
}
}
/*
回溯法求解N皇后的函数
k表示当前处理的行
n表示N皇后问题
queen存储皇后的位置
attack标记皇后的攻击位置
solve存储N皇后问题的全部解法*/
void backtrack(int k, int n, cha

&spm=1001.2101.3001.5002&articleId=115192247&d=1&t=3&u=68fc7fe095864437ba75e95ab9d5db39)
1万+

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



