Description
在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代码:
#include<iostream>//递归枚举法(回朔法)
#include<cstdio>
using namespace std;
#define N 11
int n;
int x[N],b[N],sum;//x[N]代表列
int check(int t)
{
int i;
for(i = 1;i < t;i++)
if(x[t] == x[i]||t - x[t] == i - x[i]||t + x[t] == i + x[i]) //检查是否合法,及是否和前面的皇后冲突
return 0;
return 1;
}
void search(int pos)
{
int i;
if(pos>n && n > 0) //当行号超过n时,说明满足了条件,总情况数+1
sum++;
else
for(i = 1;i <= n;i++)
{
x[pos] = i;//尝试把第pos行的皇后放在第i列
if(check(pos))
search(pos+1);//当满足check函数时(合法),则继续递归。
}
}
int main()
{
for(int i=1;i<=N;i++)
{
sum=0;
n=i;
search(1);//从第一行开始检测
b[i]=sum;
}//打表解决超时问题
while(scanf("%d",&n)&&n)
printf("%d
",b[n]);
return 0;
}
问题:之前几次当我提交代码系统都会显示超时(TIME Limite ERROR),后来向学长请教,学长告诉我这种超时问题一般用打表来解决(就是将所有可能的结果都算出来储存在一个数组中,用的时候直接调用就可以啦);
心得:这是我第一次做这样的题目,开始真的是一点思路都没有,然后经过自己不断的查阅,终于搞清了思路,解决问题这个过程真的很不容易啊。自己对于一些基本方法的应用还不是很会,一定要更努力的去学才行啊。
这里还有一个投机的代码,不建议使用,仅供参考。
AC:
#include<stdio.h>
int main()
{
int num[10]={1,0,0,2,10,4,40,92,352,724};
int n;
while(scanf("%d",&n),n)
{
printf("%d
",num[n-1]);
}
return 0;
}