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 }