题目链接:http://bailian.openjudge.cn/practice/2754
递归每一行(第几个)皇后的摆放~ cols[i]=j 表示第i行(第i个)皇后放在第j列~
然后我用的vector直接排好序
char[] 转 int 用的是 sscanf
注意的点 一开始char memset的时候全应该给‘0’ 而不是 0 要不然就会全是0
或者就不memset也可hh
本来我想打表 ,然后直接就AC了hh~
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
AC代码:
注意最后输出的index
#include<iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
using namespace std;
//解决8皇后问题
//先递归打表嘛
char cols[10]; //第i个皇后处于第j列
int t,N,idx;
vector<int> ans;
bool PUT(int x){ //检查第x个皇后的位置是否合法
//第x个皇后 就是第x行的皇后
for(int i=1;i<x;i++){
if(cols[i]==cols[x]) return false;
if(abs(x-i)==abs(cols[x]-cols[i])) return false;
}
return true;
}
//第i行能放第几列
void DFS(int x){
if(x==9) {
cols[9]='\0';
sscanf(cols,"%d",&t);
ans.push_back(t);
return;
}
for(int j=1;j<=8;j++){
cols[x]='0'+j;
if(PUT(x)){ //第x个皇后的位置
DFS(x+1);
}
}
}
int main(){
memset(cols,'0', sizeof(cols)); //初始化char数组不能初始化成0 是结束的意思哈
DFS(1);
cin>>N;
for(int i=0;i<N;i++){
cin>>idx;
cout<<ans[idx-1]<<endl;
}
}