1.链接地址:
http://bailian.openjudge.cn/practice/2754
2.题目:
总时间限制:
- 1000ms
内存限制:- 65536kB
描述
- 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b 1b 2...b 8,其中b i为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入- 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出- 输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
样例输入- 样例输出
2192 1586372484136275
3.思路:
首先把说有可能的情况保存到一个vector再查询
寻找方法利用递归+mark
4.代码:
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 int arr[8][8]; 8 vector v_res; 9 10 void f(int sum,int i)11 {12 //cout<< "f(" << sum << "," << i << ")" < = 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<