poj-2754八皇后


タイトルの説明:
チェスができる人はよく知っています.皇后は横、縦、斜線で歩数を問わず他の駒を食べることができます.どのように8人の皇后を碁盤の上に置いて(8*8つの四角格子があります)、それらを誰も食べられないようにします!これが有名な八皇后問題です.ある要求を満たす8皇后の配置方法について、1つの皇后列aとそれに対応する、すなわちa=b 1 b 2を定義する...b 8であり、biは対応するスイング法におけるi行目の皇后の列数である.8皇后問題には92組の解(すなわち92個の異なる皇后列)があることが知られている.b番目の列の出力を要求する数bが与えられる.列の比較は、皇后列xが皇后列yの前に置かれ、xが整数と見なされる場合のみyより小さい.
入力:
1行目はテストデータのグループ数nであり,その後n行に従って入力する.各試験データのセットは1行を占め、正の整数b(1<=b<=92)を含む.
出力:
出力はn行あり、各行出力は1入力に対応する.出力は正の整数であり、bに対応する皇后列であるべきである.
サンプル入力:
2
1
92

サンプル出力:
15863724
84136275
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
 
int n,ind;
bool row[12],dia1[25],dia2[25];
int ans[96][10];//ans[92][8]
int res[96];

void Dfs(int q)
{   
    if(q>8)
    {
        ind++;
        for(int i=1;i<=8;i++)
            ans[ind][i]=ans[ind-1][i];
        return;
    }
    
    for(int r=1;r<=8;r++)
    {
        if(row[r]&&dia1[r+q]&&dia2[8-q+r])
        {
            row[r]=dia1[r+q]=dia2[8-q+r]=false;
            ans[ind][q]=r;
            Dfs(q+1);
            row[r]=dia1[r+q]=dia2[8-q+r]=true;
        }
    }
}

int main()
{
   memset(row,true,sizeof(row));
   memset(dia1,true,sizeof(dia1));
   memset(dia2,true,sizeof(dia2));
   ind=1;
   Dfs(1);
   
   scanf("%d",&n);
   
   int i,x;
   while(n--)
   {
        scanf("%d",&x);
        for(i=1;i<=8;i++)
            printf("%d",ans[x][i]);
        cout<