//回溯法,从第0行开始摆放皇后,后面每次把皇后摆放到第curRow行i位置时,
//就判断是否和前面已经摆放好了的皇后冲突
//vis[curRow]=i表示尝试把第curRow行的皇后摆放到第i列
//判断行列对角线冲突方法:
//vis[curRow]==vis[j]则列冲突
//curRow+(-)vis[curRow]==j+(-)vis[curRow]则对角线冲突
#include <stdio.h>
#define N 12
int total;
int vis[N]={0};
void search(int curRow)
{
int i,j;
//已经摆放好了N个皇后,则解法+1
if(curRow==N) total++;
else for(i=0;i<N;i++)
{
int flag=0;
vis[curRow]=i;
for(j=0;j<curRow;j++)
{
//冲突检测
if(vis[curRow]==vis[j] || curRow-vis[curRow]==j-vis[j] || curRow+vis[curRow]==j+vis[j])
{
flag=1;
break;
}
}
if(!flag) search(curRow+1);
}
}
int main()
{
total=0;
search(0);
printf("%d",total);
return 0;
}
其实还是借鉴的刘汝佳的方法。注意,当N>12时程序效率变得低下,所以需要再做改进。