ACM--八皇后问题

    百练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>


你可能感兴趣的:(ACM--八皇后问题)