当前编程题:实验四 基础算法问题(16级)---八皇后问题 |
4. |
问题描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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
#include<iostream>
#include<stdlib.h> using namespace std; int aa[92][8],bb[8],num=0; int queen(int i) { if(i==8) //说明已经通过了所有的列的、对角线的判断 则这是一种放法 那么就将这种方法存到aa二维数组中 { for(int j=0;j<8;j++) { aa[num][j]=bb[j]+1; } num++; return 1; //停止这个函数 } int k; for(int j=0;j<8;j++) { for(k=0;k<i;k++) { if( bb[k]==j || abs(bb[k]-j)==i-k ) //前面的条件是为了判断是否是在同一列上 后面的就是判断是否在同一对角线上 同一对角线的判断有点抽象 可以自己用笔画一画 就应该能理解了 { break; // 停止循环 到下一个空格测试 } } if(k==i) // 说明通过了测验 可以往下进行 { bb[k]=j; queen(i+1); //递归 } } return 0; } int main() { queen(0); // 开始找八皇后的方法 int n; cin>>n; while(n--) { int m; cin>>m; for(int i=0;i<8;i++) { cout<<aa[m-1][i]; } cout<<endl; } return 0; } |