• COJ 0024 N皇后问题


    N皇后问题
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述
        在N*N的方格棋盘放置N个皇,使得它们不相互攻击(即任意2个皇后不允许处在同一行,或同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种符合要求放置方法。
    输入
    输入中有一个正整数N≤20,表示棋盘和皇后的数量
    输出
    为一个正整数,表示N个皇后的不同放置方法数。
    输入示例
    5
    输出示例
    10

    题解:上来写了一发常数巨大= =,别用二维数组= =

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=25;
    11 int ans=0,a[maxn],n;
    12 bool check(int t){
    13     for(int i=0;i<t;i++) if(a[t]==a[i]||t+a[t]==i+a[i]||t-a[t]==i-a[i]) return false;
    14     return true;
    15 }
    16 void dfs(int d){
    17     if(d==n){ans++;return;}
    18     for(int i=0;i<n;i++){
    19         a[d]=i;if(check(d)) dfs(d+1);
    20     } return;
    21 }
    22 inline int read(){
    23     int x=0,sig=1;char ch=getchar();
    24     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    25     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    26     return x*=sig;
    27 }
    28 inline void write(int x){
    29     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    30     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    31     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    32 }
    33 void init(){
    34     n=read();
    35     dfs(0);write(ans);
    36     return;
    37 }
    38 void work(){
    39     return;
    40 }
    41 void print(){
    42     return;
    43 }
    44 int main(){init();work();print();return 0;}
  • 相关阅读:
    epoll的LT和ET(转)
    js和jQuery的互相转换
    Spring的回滚问题
    Spring的事务
    分布式锁的实现方式
    xml是什么
    ajax的4个字母分别是什么意思
    try、catch、finally都有return语句时执行哪个
    静态变量、实例变量、局部变量线程安全吗,为什么
    String和StringBuilder、StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/chxer/p/4591508.html
Copyright © 2020-2023  润新知