八皇后问题

时间:2020-05-23 20:23:54   收藏:0   阅读:64

描述

       会下国际象棋的人都知道:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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 }

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!