您的位置:首页 > 其它

九度oj 1140

2015-08-25 20:33 495 查看
题目1140:八皇后

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:772

解决:481

题目描述:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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


来源:2008年北京大学软件所计算机研究生机试真题
#include <iostream>
#include <vector>

using namespace std;

vector<int> ansVec;
bool mark[10];

int abs(int x){
return x>0?x:-x;
}

void initMark(){
for(int i=0;i<10;++i)
mark[i]=true;
}

bool check(int num){
for(int i=0;i<num-1;++i){
for(int j=i+1;j<num;++j){
if(abs(i-j)==abs(ansVec[i]-ansVec[j]))
return false;
}
}
return true;
}

int cnt;

void DFS(int num,int n){
if(ansVec.size()==8){
if(!check(num))
return;
++cnt;
if(cnt==n){
vector<int>::iterator iter;
for(iter=ansVec.begin();iter!=ansVec.end();++iter)
cout<<*iter;
cout<<endl;
}
return;
}
if(!check(num))
return;
for(int i=1;i<=8;++i){
if(mark[i]==false)
continue;
mark[i]=false;
ansVec.push_back(i);
DFS(num+1,n);
mark[i]=true;
ansVec.pop_back();
}
return;
}

int main()
{
int n,x;
while(cin>>n){
while(n--){
cin>>x;
cnt=0;
initMark();
DFS(0,x);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: