在一个8 x 8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互攻击的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。
解题思路:
1. 建立一个N x N(!N皇后问题都适用:))的棋盘,用 1 代表皇后,0 代表空格,2 代表边界。
2.检查是否出现攻击,若没有出现攻击则放置皇后,继续下一行寻找(递归)。
3.若出现攻击则继续下一个位置的检测,若该行没有合适的位置则将上一行放置的皇后撤回,继续上一行寻找(回溯)。
举例说明如下:
若按上图放置则会发现第六行没有满足条件的位置,因此需要撤销第五行的放置继续向后寻找第五行应放的位置。
程序实现:
由解题思路可以看出实现该算法所需要的函数即为棋盘生成函数,检查函数和放置皇后函数,同时还需要显示函数进行结果观察。
检查函数代码如下(c语言):
int check1(int i, int j)
{
if(a[i][j] == 1)
{
return 0;
}
if(a[i][j] == 2)
{
return 1;
}
if(a[i][j] == 0)
{
return check1(i-1,j-1);
}
}
放置皇后函数代码如下:
void find(int i)
{
int j;
if(i > 8)
{
count++;
display();
}
else
{
for(j = 1; j < 9; j++)
{
if(check1(i,j)&& check2(i,j)&&check3(i,j))
{
a[i][j] = 1;
find(i+1);
a[i][j] = 0;
}
}
}
}
其中check1(i,j)为检查左对角线(上述给出),check2(i,j)和check3(i,j)则分别为检查右对角线与同列元素(与check1(i,j)相似)。