八皇后问题

青春壹個敷衍的年華 提交于 2019-12-02 00:48:20

Description

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

Input

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

Output

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

Sample Input

3
6
4
25

Sample Output

25713864
17582463
36824175

 

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 //const double PI=acos(-1);
17 #define Bug cout<<"---------------------"<<endl
18 const int maxn=1e5+10;
19 using namespace std;
20 
21 int vis[10];
22 int A[10];
23 int ans[93][10];
24 int cnt=0;
25 
26 int judge(int n)
27 {
28     int flag=1;
29     for(int i=1;i<=n;i++)
30     {
31         for(int j=1;j<=n;j++)
32         {
33             if(i!=j&&abs(i-j)==abs(A[i]-A[j]))  //别忘了i!=j 
34                 flag=0;
35         }
36     }
37     return flag;
38 }
39 
40 void dfs(int p,int n)
41 {
42     A[n]=p;
43     if(judge(n)==0)
44         return ;
45     if(n==8)
46     {
47         cnt++;
48         for(int k=1;k<=8;k++)
49             ans[cnt][k]=A[k];  //第一次写成ans[++cnt][k]=A[k]了。。。 
50         return ;
51     }
52     for(int i=1;i<=8;i++)
53     {
54         if(vis[i]==0)
55         {
56             vis[i]=1;
57             dfs(i,n+1);
58             vis[i]=0;
59         }
60     }
61 }
62 
63 int main()
64 {
65     for(int i=1;i<=8;i++)
66     {
67         vis[i]=1;
68         dfs(i,1);
69         vis[i]=0;
70     }
71     int T;
72     scanf("%d",&T);
73     while(T--)
74     {
75         int n;
76         scanf("%d",&n);
77         for(int i=1;i<=8;i++)
78             printf("%d",ans[n][i]);
79         printf("\n");
80     }
81     return 0;
82 }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!