在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
8
5
1
92
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input:
共有若干行,每行一个正整数N≤12,表示棋盘和皇后的数量;如果N=0,表示结束。
Output:共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input:
18
5
0
Sample Output:1
92
10
给个好理解,但效率不高的方法:主要是检查同斜线: if( ( hang+lie == tempCol+tempRow ) || ( (hang-lie) == (tempCol-tempRow) ) )
#include <stdio.h>
int save[13]={0},count,M;
int issafe(int hang,int lie) //tempCol临时行,tempRow临时列
{
int tempCol,tempRow;
for(tempCol=0;tempCol<hang;tempCol++)
{
tempRow = save[tempCol];
if( lie == tempRow ) //同列,行就不用检查了
return 0;
if( ( hang+lie == tempCol+tempRow ) || ( (hang-lie) == (tempCol-tempRow) ) )
return 0; //斜线
}
return 1;
}
void dfs(int hang)
{
int lie;
if(hang == M )
{
++count;
return ;
}
for(lie=0;lie<M;lie++)
{
if( issafe(hang,lie) )
{
save[hang]=lie;
dfs(hang+1);
save[hang]=0;
}
}
}
int main()
{
while(scanf("%d",&M)!=EOF && M!=0 )
{
count=0;
dfs(0);
printf("%d\n",count);
}
return 0;
}