OpenJudge 2754 八皇后

1.链接地址:

http://bailian.openjudge.cn/practice/2754

2.题目:

总时间限制:
1000ms
内存限制:
65536kB
描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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的皇后串。
样例输入
2
1
92
样例输出
15863724
84136275

3.思路:

首先把说有可能的情况保存到一个vector再查询

寻找方法利用递归+mark

4.代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 int arr[8][8];
 8 vector<int> v_res;
 9 
10 void f(int sum,int i)
11 {
12     //cout<< "f(" << sum << "," << i << ")" <<endl;
13     int j,k;
14     for(j = 0; j < 8; ++j)
15     {
16         if(arr[i][j] == 0)
17         {
18             if(i == 7)
19             {
20                 v_res.push_back(sum * 10 + (j + 1));
21             }
22             else
23             {
24                 arr[i][j] = 1;
25                 for(k = i + 1; k < 8; ++k) arr[k][j] += 1;
26                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] += 1;
27                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] += 1;
28                 f(sum * 10 + (j + 1), i + 1);
29                 arr[i][j] = 0;
30                 for(k = i + 1; k < 8; ++k) arr[k][j] -= 1;
31                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] -= 1;
32                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] -= 1;
33             }
34         }
35     }
36 }
37 
38 int main()
39 {
40     //freopen("C://input.txt","r",stdin);
41 
42     int n;
43     cin>>n;
44 
45         f(0,0);
46 
47     int b;
48     while(n--)
49     {
50         cin>>b;
51         cout<<v_res[b - 1]<<endl;
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/mobileliker/p/3556810.html