题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
回溯法解N皇后问题相对较容易。
对于棋盘,用一维数组存储即可。i代表第i行,可以保证一定不会在同一行了,a[i]表示列数。其中不会相互攻击的条件是:不能在同一列,即a[i]!=a[j];不能在一条斜线上,即行数相减的绝对值不能等于列数相减的绝对值。
打表代码:
#include<stdio.h>
#include<cmath>
using namespace std;
int a[11];
int ans,n;
bool place(int r)
{
for(int i=1; i<r; i++)//判断之前的各行是否都可以与第r行现在放置的皇后不会发生攻击,只有所有之前放置的皇后都满足要求方案才可行
if(abs(a[i]-a[r])==abs(i-r)||a[i]==a[r])
return 0;
return 1;
}
void queen(int r)//放置第r行
{
if(r>n)//表示已经把n行都放好了,方案数加一
ans++;
else
{
for(int i=1; i<=n; i++)
{
a[r]=i;//遍历第r行中所有可能的列
if(place(r))//判断是否可以放置,若可行,则放置下一行
queen(r+1);
}
}
}
int main()
{
while(~scanf("%d",&n))
{
if(n==0)
break;
else
{
ans=0;//记录方案数
queen(1);//从第一行开始放皇后。
printf("%d\n",ans);
}
}
return 0;
}
#include<stdio.h>
int main()
{
int n,a[11]= {0,1,0,0,2,10,4,40,92,352,724};
while(~scanf("%d",&n)&&n)
printf("%d\n",a[n]);
return 0;
}