//回溯法,從第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時程序效率變得低下,所以需要再做改進。