Description
对于某个满足要求的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 }
来源:博客园
作者:WorLone
链接:https://www.cnblogs.com/jiamian/p/11723630.html