#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int Q=8;
int map[Q][Q]={0};//棋盘;
int q[Q]={0};//第一列皇后的位置
int mc[15]={0};//主对角线
int mmc[15]={0};//副对角线;
int Count=0; //第X种解;
void DFS(int i)/*第几行或者第几列*/{
int cnt=0;//放皇后的位置;
for(;cnt<Q;cnt++){
if(q[cnt]==0 && mc[i-cnt+7]==0 && mmc[i+cnt]==0 ) /*判断当前位置是否有皇后和对角线上是否有皇后;*/{
q[cnt]=1;//标记状态为使用;
mc[i-cnt+7]=1;
mmc[i+cnt]=1;
map[cnt][i]=1;//cnt 和i 的位置决定着当前棋局是以行的方式或者列的方式摆放第一个皇后,第一次
//自己是map[i][cnt]……WA了一次;
if(i==7)/*当前皇后已经布满*/{
Count++;//个数增加;
printf("NO. %d\n",Count);
for(int x=0;x<Q;x++){//输出棋盘;
for(int y=0;y<Q;y++){
printf("%d ",map[x][y]);
}
printf("\n");
}
}
else if(i<Q-1){//位置不满,继续找;
DFS(i+1);
}
map[cnt][i]=0;//传说中的回溯;不满足的话,拿掉皇后;
q[cnt]=0;
mc[i-cnt+7]=0;
mmc[i+cnt]=0;
}
}
}