1214:八皇后

【题目描述】

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8a=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

【来源】

#include<bits/stdc++.h>

using namespace std;

int a[119];

int m[100];

int w[100];

int p[94][9];

int tot=0;

int visited[1009];

int dfs(int j)

{

       for(int i=1;i<=8;i++)

       {

              if(!m[i+j]&&!w[j-i+7]&&!visited[i])

              {

                a[j]=i;

                visited[i]=1;

                m[i+j]=1;

                w[j-i+7]=1;

          if(j==8) {

                           

                            tot++;

                            int ta=0;

                         for(int i=1;i<=8;i++)

                         //cout<<a[i]       //这地方,最易错,注意是回溯问题,所以给二维数据要重新1到8给值,直接在a[j]=后面赋值是得不全的。

                          p[tot][++ta]=a[i]; 

          }

          else

                 dfs(j+1);

                visited[i]=0;

                  m[i+j]=0;

                w[j-i+7]=0;

                     }

              }

}

 

 

int main()

{

       int n;

       cin>>n;

       dfs(1);

       for(int i=0;i<n;i++)

       {

          int b;

          cin>>b;

          for(int j=1;j<=8;j++)

          {

                     cout<<p[b][j];

                     }

              cout<<endl;

              }

       return 0;

}

posted @ 2019-05-22 16:05  玛克人(Macren)  阅读(807)  评论(0编辑  收藏  举报