八个皇后问题
背景
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路
这个问题看似很复杂但是我们分析一下假设我第一行放下第一个,那么我放下一个就会受到限制,当再放一个时候,会受到前两个的限制,那么随着放得越多,受限制越多,可放得地方越少,当放到第八个的时候(在规则下)我们将把这一种输出出来。
第一步
首先我们去写一个方法去判断可能放的点。根据规则,皇后走米字格,所以放一个皇后我们把8x8的矩阵中相应的地方标注1(0表示可以放)。
int danger(int row ,int n,int (*chess)[8])
{
int x = row;
int y = n;
int l1=0, l2=0, l3=0, l4=0, l5=0, l6=0;//横,竖,右上,右下,左上,左下
int a, b;
for ( a = 0; a < 8; a++)//判断行是否为0如果是则标记为1
{
if (chess[a][n] != 0) {
l1 = 1;
break;
}
}
for (b = 0; b < 8; b++)//判断列是否为0如果是则标记为1
{
if