题目
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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
//错误代码,按题目要求a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。
#include <iostream>
using namespace std;
//用来存储方案 ,下标都是从1开始
int a[9][9];
int visRow[9]; //行
int visLeftIncline[17];//左斜线 使用的时候 row+column
int visRightIncline[16]; //右斜线,使用的时候row-column+8
int ansCount=0;
int b[93][10];void print(){++ansCount;for(int i=1;i<=8;i++){for(int j=1;j<=8;j++){if(a[i][j]==1){b[ansCount][i]=j;break; } }}} void search(int column){if(column>8){//if(ansCount>=5) return;print();//cout<< ansCount<<endl;}else{for(int row=1;row<=8;row++){if(!visRow[row]&&!visLeftIncline[row+column]&&!visRightIncline[row-column+8]){visRow[row]=1;visLeftIncline[row+column]=1;visRightIncline[row-column+8]=1;a[row][column]=1;search(column+1);//找下一列//回溯 visRow[row]=0;visLeftIncline[row+column]=0;visRightIncline[row-column+8]=0;a[row][column]=0; }}}
}int main(){search(1);int n,aww;cin>>n;for(int i=0;i<n;++i){cin>>aww;for(int j=1;j<=8;++j){cout<<b[aww][j];}cout<<endl;} return 0;
}
//ac代码:
//明明是从第一列到第八列的行数的组合,题目绝对有问题
#include <iostream>
using namespace std;
//用来存储方案 ,下标都是从1开始
int a[93][9];
int visRow[9]; //行
int visLeftIncline[17];//左斜线 使用的时候 row+column
int visRightIncline[16]; //右斜线,使用的时候row-column+8
int ansCount=1;void init(){}void print(){int case1;cin>>case1;int detailCase;while(case1--){cin>>detailCase;for(int i=1;i<=8;i++){cout<<a[detailCase][i];}cout<<endl;}} void search(int column){if(column>8){++ansCount; //因为是树形结构,所以下面的解要用到前面的解//因为是直接从中间开始,所以前面的值直接用 ansCount-1填//for(int i=1;i<=8;i++){a[ansCount][i]=a[ansCount-1][i];}}else{for(int row=1;row<=8;row++){if(!visRow[row]&&!visLeftIncline[row+column]&&!visRightIncline[row-column+8]){visRow[row]=1;visLeftIncline[row+column]=1;visRightIncline[row-column+8]=1;a[ansCount][column]=row;//记录这一列是在第几行search(column+1);//找下一列//回溯 visRow[row]=0;visLeftIncline[row+column]=0;visRightIncline[row-column+8]=0;}}}
}int main(){init(); search(1);print();return 0;
}