标签:
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;}
标签:
原文地址:http://www.cnblogs.com/chxer/p/4591508.html