在这里记录N皇后的求解问题,一道回溯方法的经典问题!
可以这样理解:
回溯方法其实要遍历所有的解空间(如果想找到所有解的话),其时间复杂度还是很高的;如果只想求解其中方案的话,只需要在第一次找到问题的解时跳出即可。
回溯方法也用到了递归程序设计,递归程序在解决分治问题以及回溯问题等方面真的很有用,不过要区分递归程序在分治和回溯问题中的使用方法,在回溯方法中多半要使用到循环,在循环中嵌套递归程序。
下面的程序实现:输入任意N皇后,可以输出其所有的解,并且输出共有多少种解法。
#include<iostream>
using namespace std;
//解决N皇后问题
//输出棋盘,将其中的-1显示为0(方便查看结果)
void display(int **a, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == -1) {
cout << "0" << " ";
}
else {
cout << "1" << " ";
}
}
cout << endl;
}
cout << endl;
}
int judgeQueenCanBeThere(int **a, int x, int y, int n) {
int flag = 1;
for (int i = 0; i < n; i++) {
if (a[x][i] != -1) {
//表示已经有了
flag = 0;
}
}
for (int j = 0; j < n; j++) {
if (a[j][y] != -1) {
//表示已经有了
flag = 0;
}
}
//下面这里来判断斜对角线
for (int i = 1; i < n; i++) {
//先计算共同减1的情况
if (x - i < 0 || y - i < 0) {
}
else {
if (a[x - i][y - i] != -1) {
flag = 0;
}
}
//再计算共同加1的情况
if (x + i > n - 1 || y + i>n - 1) {
}
else {
if (a[x + i][y + i] != -1) {
flag = 0;
}
}
}
//这里来计算1加1减的情况
for (int i = 1; i < n; i++) {
//先判断x-,y+的情况
if (x - i < 0 || y + i>n - 1) {
}
else {
if (a[x - i][y + i] != -1) {
flag = 0;
}
}
//再判断x+,y-的情况
if (x + i > n - 1 || y - i < 0) {
}
else {
if (a[x + i][y - i] != -1) {
flag = 0;
}
}
}
if (flag == 1) {
return 1;
}
else {
return 0;
}
}
int global = 0;
//控制皇后的摆放
int putQueen(int **a, int x, int n) {
if (x > n - 1) {
display(a, n);
global++;
return 0;
}
int times = 0;
for (int j = 0; j < n; j++) {
int index = judgeQueenCanBeThere(a, x, j, n);
if (index == 1) {
//说明这一层的这个位置可以放置
a[x][j] = 1;
int re = putQueen(a, x + 1, n);
if (re == 0) {
//说明下一层没法排布
a[x][j] = -1;
times++;
}
}
else {
times++;
a[x][j] = -1;
}
}
if (times == n) { //这里表示这一行都没地方放,就要回到前一行
return 0;
}
}
int main() {
while (1) {
global = 0;
int n;
cin >> n;
int** a = new int*[n];
for (int i = 0; i < n; i++)
{
a[i] = new int[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = -1;
}
}
int re = putQueen(a, 0, n);
cout << n<<" 皇后的解法共有:" << global<<" 种!" << endl;
}
system("pause");
return 0;
}
下面为程序的运行结果:
程序应该还有待改进的地方,只是实现最基本的N皇后求解问题,希望小伙伴能够提出宝贵意见!