八皇后问题介绍
八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?
所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......
#include <iostream>
#include <stdlib.h>
using namespace std;
const int MAX_NUM = 8;
int chessBoard[MAX_NUM][MAX_NUM];
///——————————>x
//|0 1 2 3 4 5 6 7 8
//|1
//|2
//|3
//|4
//|5
//|6
//|7
//|8
//|y
//打印棋盘
void printchessBoard()
{
for (int i = 0;i<MAX_NUM;i++)
{
for(int j = 0;j<MAX_NUM;j++)
{
cout<<chessBoard[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
//检查是否符合要求
bool check(int x,int y){
for (int i =0;i<y;i++)
{
//检查纵向
if(chessBoard[x][i] == 1)
{
return false;
}
//检查左斜线
if (chessBoard[x-1-i][y-1-i] == 1 && x-1-i >= 0)
{
return false;
}
//检查右斜线
if(chessBoard[x+1+i][y-1-i] == 1 && x+1+i < MAX_NUM)
{
return false;
}
}
return true;
}
bool settleQueen(int y)
{
//位数超过8,说明找到了答案
if(y == MAX_NUM)
{
return true;
}
//遍历当前行,逐一验证
for (int i=0;i<MAX_NUM;i++)
{
//为当前行清零,以免回溯时出现脏数据
for (int x=0;x<MAX_NUM;x++)
{
chessBoard[x][y] = 0;
}
//检查是否符合规则,如果符合,更改元素值并进一步递归
if (check(i,y))
{
chessBoard[i][y] = 1;
//递归如果返回true,说明下层已经找到解决方案,无需继续循环
if (settleQueen(y+1))
{
return true;
}
}
}
return false;
}
void main()
{
settleQueen(0);
printchessBoard();
system("pause");
}
最后的结果为