八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
算法思路:
八皇后问题实质为一种深度优先(DFS)搜索问题。
可分为两个子函数来解决该问题。第一个子函数用于在棋盘上放置皇后。第二个子函数用于检查摆放过程中有没有违反放置规则。
实际运行过程,为放置第一层上的皇后,进入下一层然后先对上一层检查,合法则进行下一行的放置。反之则退出递归调用,将非法行上的皇后移位。
算法具体描述:
放置皇后函数void Queen_Move(int i);
void Queen_Move(int i)
{
int m = 0;//每行放置的格子位置
if (i == 8)//弹出递归的条件(放完了第8行)和打印结果;
{
map++;//总的放置方法个数
cout << "Queens Location :" << map << endl;
Print();//打印函数
return;}
for (m = 0; m < 8; m++)//一行有八个格子,循环八次
{
if (Check(i,m) == 1)//检验上一次摆放合法后进入
{
Board[i][m] = 1;//放置皇后
Queen_Move(i + 1);//进入下一层放置皇后
Board[i][m] = 0;//进入递归下一层后,清除上一层数据,发现错误后正确进入下一个格子
}
}
}
检查摆放合法函数:int Check(int k, int j)
int Check(int k, int j)
{
//由于以行为单位进行递归放置,因此不会出现一行中放置多个Queen的情况
for (int i = 0; i < 8; i++) //检查列
{
if (Board[i][j] == 1)
{
return 0;
}
}
for (int i = k - 1, m = j - 1; i >= 0 && m >= 0; i--, m--)
//检查左对角线
{
if (Board[i][m] == 1)
{
return 0;
}
}
for (int i = k - 1, m = j + 1; i >= 0 && m <= 7; i--, m++)
//检查右对角线
{
if (Board[i][m] == 1)
{
return 0;
}
}
return 1;
}
八皇后问题抽象出来的模型,实质为一种以深度为单位进行相关检索的程序设计问题。棋盘的每一层即可被抽象为一层,共八层,从第一层开始寻找,合理进入下一层,并寻找前面摆放是否合法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。