H~N皇后问题

Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 
你的任务是,对于给定的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\n",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\n",num[n-1]); } return 0; }
posted @ 2016-07-16 09:04  踮起脚望天  阅读(580)  评论(0编辑  收藏  举报