#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include <math.h>
#define QUEEN 8 //皇后的数目
#define N -1000 //初始化棋盘
int a[QUEEN]; //棋盘
int can(int n ,int j) //判断是否能放皇后
{
for (int i = 0 ; i < QUEEN ; i++ )
{
if (a[i]==j||abs(i-n)==abs(a[i]-j)) //判断列相同与对角线相同
return 0 ;
}
return 1 ;
}
void intit() //初始化棋盘
{
int *p ;
for (p = a ;p < a + QUEEN ;++p)
*p = N ;
}
int main ()
{
intit() ;
int i=0 , j=0 ,count=0;
while (i < QUEEN) {
while (j < QUEEN) {
if(can(i,j))
{
a[i] = j ; //放入皇后
j = 0 ; //将j置零方便下次探测
break ;
}
else
j++ ; //在下一列中探测
}
if (a[i] == N)//如果此行没有插入的位置
{
if (i == 0) //已经回溯到第一行
break ; //已经找到所有解
else
{
i--; //回溯,将皇后向后移一位
j = a[i] + 1 ;
a[i] = N ; //清空当前行皇后
continue ;
}
}
if(i == QUEEN - 1 ) //已经找到最后一行
{
count++ ;//说明已经找出一个答案,答案数加一
j = a[i] + 1 ; //将此行皇后后移
a[i] = N ;//清空此行皇后
continue ;
}
i++ ; //行数加一
}
printf("%d",count);
}
用回溯法解决n皇后问题