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 }
本人小白第一篇题解,多有不好之处,望海涵。我会继续努力的^~^.

浙公网安备 33010602011771号