百练OJ题目地址:点击打开链接
2754:八皇后问题
总时间限制: 1000ms 内存限制: 65536kB
- 描述
- 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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
<span style="color:#333333;background-color: rgb(255, 255, 255);">#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;
static int gEightQueen[8] = {0};
static int gCount = 0;
vector<string> result;
/**
这个函数用来遍历八皇后
作用是将八皇后的各种情况
打印在命令行上
*/
void print(){
int outer;
int inner;
string s;
for(outer = 0; outer <8; outer ++){
for(inner = 0; inner < gEightQueen[outer]; inner ++){
}
switch(inner){
case 0:
s.append("1");
break;
case 1:
s.append("2");
break;
case 2:
s.append("3");
break;
case 3:
s.append("4");
break;
case 4:
s.append("5");
break;
case 5:
s.append("6");
break;
case 6:
s.append("7");
break;
case 7:
s.append("8");
break;
}
}
result.push_back(s);
//cout<<s<<endl;
// printf("\n");
}
/**
这个函数用来判断下一个皇后的位是否
是可行的
loop:这个是第几个皇后
value:这个是皇后的位置
*/
int is_OK(int loop,int value){
int index,data;
//这里是将前面的皇后都遍历一次,
//保证每个皇后都不能吃到下一个皇后
for(index=0;index<loop;index++){
data = gEightQueen[index];
//下一个皇后不能在这个皇后的正下方
if(data==value){
return 0;
}
//下一个皇后不能在这个皇后的右下角
if((index+data)==(loop+value)){
return 0;
}
//下一个皇后不能在这个皇后的左下角
if((index-data)==(loop-value)){
return 0;
}
}
return 1;
}
/**
这个函数用来对皇后进行计算
index:从第几个皇后开始(从第几行开始)
*/
void eight_queue(int index){
int loop;
//这里是用来构造八个皇后
for(loop=0;loop<8;loop++){
//用来判断第index个皇后在loop位置是否可行
if(is_OK(index,loop)){
//如果可行就将结构记录在这个全局数组中
gEightQueen[index] = loop;
if(7==index){
//打印并将全局变量增加一次
print();
gCount ++;
//将index这个皇后清空,方便下一次遍历
gEightQueen[index]=0;
return ;
}
//这里使用了递归
eight_queue(index+1);
//这里是回溯的思想,方便下一次遍历
gEightQueen[index]=0;
}
}
}
int main()
{
int n;
scanf("%d",&n);
eight_queue(0);
while(n--){
int x;
scanf("%d",&x);
cout<<result.at(x-1)<<endl;
}
return 1;
}
</span>