2046 Problem D 八皇后

   

题目描述

 

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

 

输入

 

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

 

输出

 

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

样例输入

3
6
4
25

样例输出

25713864
17582463
36824175


主要是对对角线处理,
其左对角线为[i+n][j-n];
右对角线为[i+n][j+n];

注意判断是否越界。


 1    #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,q[9],g[9][9]//进行标记;
 5 string str[93];
 6 void dfs(int depth){
 7  if(depth==9){
 8   ++z;
 9   for(int a=1;a<=8;a++){ 
10   str[z]+=(char)(q[a]+48);
11  }
12   return;
13 } 
14  for(int i=1;i<=8;i++){
15   if(!(g[depth][i])){
16   for(int j=1;j<=8;j++){
17   g[depth][j]+=1;
18   g[j][i]+=1;//进行 列标记 
19   if((depth+j)<=8&&(i+j)<=8)
20   g[depth+j][i+j]+=1;//进行右对角线标记 
21   if((depth+j<=8)&&(i-j)>0)
22   g[depth+j][i-j]+=1;//进行左对角线标记 
23  }
24   q[depth]=i;
25   dfs(depth+1);
26    
27   for(int j=1;j<=8;j++){
28   g[depth][j]-=1; 
29   g[j][i]-=1;
30   if((depth+j)<=8&&(i+j)<=8)
31   g[depth+j][i+j]-=1;
32   if((depth+j<=8)&&(i-j)>0)
33   g[depth+j][i-j]-=1;
34  }
35  }
36  else continue;
37  }
38  return;
39 }
40 int main() {
41  int z;
42  cin>>n;
43  dfs(1);
44  for(int i=0;i<n;i++){
45   cin>>z;
46   cout<<str[z]<<endl;
47  }
48  return 0;
49 }

 




本人小白第一篇题解,多有不好之处,望海涵。我会继续努力的^~^.
[提交][状态]
posted @ 2019-08-03 14:12  诺启辰~  阅读(204)  评论(0)    收藏  举报