首页 > 技术文章 > COJ 0024 N皇后问题

chxer 2015-06-21 09:32 原文

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('\n')
 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;}

 

推荐阅读