• 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
    ",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; }
  • 相关阅读:
    go 基本类型
    slice底层实现
    数组Array
    GO内置类型和函数
    python 操作es
    go 相关命令
    Init函数和main函数
    切片
    RecursionError: maximum recursion depth exceeded
    多项式工业基础与全家桶
  • 原文地址:https://www.cnblogs.com/lbyj/p/5675335.html
Copyright © 2020-2023  润新知