【算法练习】递归/八皇后 百练poj2754:八皇后

题目链接: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;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/100567196
今日推荐