N皇后问题
Time limit 1000 ms
Memory limit 32768 kB
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input
1
8
5
0
Sample Output
1
92
10
分析:搜索,每次检查一下该列是否已经放了皇后,同时检查主副对角线,主副对角线参考了别人数学的处理方法,即:在对角线上的两点坐标满足横纵坐标之差的绝对值相等!我刚开始是每一次输入一个查询的数据就搜索一次,然后交上去的代码超时了,后来用自己写的代码输出结果打了个表就AC了,参考了别人的博客,发现他们用的记忆化搜索的方式,就避免了重复搜索!我还是太菜啊!
AC代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 15
using namespace std;
int ans;
int Queen[N];
int n;
void dfs(int k)
{
if (k==n+1)
{
ans++;
return ;
}
int i,j;
for ( i=1;i<=n;i++)
{
for (j=1;j<k;j++)
{
if (Queen[j]==i||abs(Queen[j]-i)==abs(k-j))
break;
}
if (j>=k)
{
Queen[k]=i;
dfs(k+1);
}
}
}
int sum[N];
int main()
{
for (int i=1;i<=10;i++)
{
n=i;
ans=0;
dfs(1);
sum[i]=ans;
}
while (cin>>n&&n!=0)
{
cout << sum[n] << endl;
}
return 0;
}