八皇后问题
Posted cyk20081108
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题相关的知识,希望对你有一定的参考价值。
描述
会下国际象棋的人都知道:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的八皇后的摆放方法,定义一个与皇后串a与之对应,即a=b1b2···b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道八皇后问题一共有92组解法。给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,仅当将x视为整数时比y小。
输入:
第1行是测试数据的数组n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1<=b<=92)。
输出:
有n行,每行输出对应一个输入。输出应是一个正常数,是对应于b的皇后串。
输入样例1:
2
1
92
输出样例1:
15863724
84136275
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 bool b[100]={0},c[100]={0},d[100]={0}; 5 int a[100],s[93],k=0; 6 int search(int); 7 void print(); 8 using namespace std; 9 int main() 10 { 11 int n,j; 12 cin>>n; 13 search(1); 14 for(int i=1;i<=n;i++) 15 { 16 cin>>j; 17 cout<<s[j]<<endl; 18 } 19 return 0; 20 } 21 int search(int i) 22 { 23 int j; 24 for(int j=1;j<=8;j++) 25 { 26 if((! b[j])&&(! c[i+j])&&(! d[i-j+7])) 27 { 28 a[i]=j; 29 b[j]=1; 30 c[i+j]=1; 31 d[i-j+7]=1; 32 if(i==8) print(); 33 else search(i+1); 34 b[j]=0; 35 c[i+j]=0; 36 d[i-j+7]=0; 37 } 38 } 39 } 40 void print() 41 { 42 int i,p=1; 43 k++; 44 for(i=8;i>=1;i--) 45 { 46 s[k]+=a[i]*p; 47 p*=10; 48 } 49 }
以上是关于八皇后问题的主要内容,如果未能解决你的问题,请参考以下文章