//我竟然自己写出来了 /* 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; } }