//我竟然自己写出来了
/*
DFS的形态千变万化,没有定数,但掌握基本框架就能以不变应万变:
DFS里面要先写上返回条件,也就是该方案算到底成功了,就返回。
然后就对所有路径进行枚举,排除掉不对的方案后,调用下一层DFS。
一条路径算到底之后才会算其他路径,因此,有关上一条路径做的标记要全部还原,再进入下一条路径的寻找。
*/
/*
字符串不初始化会发生段错误
*/
#include <iostream>
#include <cstring>
using namespace std;
string answer[92];//共92个答案
int xb=0;//当前答案下标
int chess[9];//第i行的皇后放在了第几列上
void DFS(int row)//当前放好的皇后的行号,1
{
if(row==8)//1~8行的皇后都放好了
{
for(int i=1;i<=8;i++)
{
char lie=chess[i]+'0';
answer[xb]+=lie;
}
xb++;
return;
}
for(int j=1;j<=8;j++)//下一行的皇后可以放在1~8列上
{
int flag=1;//这一行的皇后能放在第j列上
for(int i=1;i<=row;i++)//不能和1~row行皇后在同一列或者同一斜线上
{
//i,chess[i]
//row+1,j
if(chess[i]==j||abs(row+1-i)==abs(j-chess[i]))
{
flag=0;
break;
}
}
if(flag==1)//当前方案可行
{
chess[row+1]=j;//记录
DFS(row+1);
chess[row+1]=0;//这个方案的答案已经算到底了,就可以把原来有关这个方案的标记全都还原了
}
}
}
int main() {
int b;
while (cin >> b) {
memset(chess,0,sizeof(chess));
for(int i=0;i<92;i++)
answer[i]="";//字符串不能为空!!!必须要先赋值,否则会发生段错误
for(int i=1;i<=8;i++)
{
chess[1]=i;//第一行皇后分别放在1~8列上
DFS(1);//当前皇后行号
chess[1]=0;
}
cout << answer[b-1] << endl;
}
}