本文共 1339 字,大约阅读时间需要 4 分钟。
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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的皇后串。
2 1 92
15863724 84136275
即找出所有的八皇后放置的可能,然后按照从小到大的顺序找出第b个八皇后序列。
八皇后解题:
#include#include #include #include #define N 100using namespace std;int a[N][N],b[N];int vis[N];int s; int check(int step){ //如果两列上皇后的行的差=列的差 或者 两列上皇后的行相同,说明放的位置错误 for(int i=1;i<=step-1;i++) if((abs(b[i]-b[step])==abs(i-step))) return 0; return 1;}void dfs(int step) //搜索每一行{ if(step==8+1) { s++; for(int i=1; i<=8; i++) a[s][i]=b[i]; return; } for(int i=1; i<=8; i++) //遍历step行上的每一列 { if(vis[i]==0) //说明step行的i列未放皇后 { b[step]=i; if(check(step)) { vis[i]=1; dfs(step+1); vis[i]=0; } } }} int main(){ dfs(1); int t,x; scanf("%d",&t); while(t--){ scanf("%d",&x); for(int j=1; j<=8; j++) { printf("%d",a[x][j]); } cout<
转载地址:http://zvzci.baihongyu.com/