目录
一、题目原文
二、题目分析
在分析题目前,读者应理解“冲突”的概念。
特别注意的是,每次对vector<int>插入新信息之后,应在末尾将其弹出,因为插入的新信息已通过参数传送到下一层递归或者已经被总记录vector<vector<int>>记录下来,弹出的意图在于让第n个皇后的插入位置随着循环而不断改变,直至遍历完所有的可能的位置,这是本题目的算法难点。
三、代码书写
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
vector <vector<int>> all; //皇后插入位置序列的总记录
void DFS(vector<int> &queen,int pos){ //深度优先遍历算法,传入记录当前序列的的vector和当前插入的是第几个皇后
for(int i=1;i<=8;i++){ //皇后从第1列开始插入,重复循环到第8列
bool isok=true; //设置布尔型变量,记录当前位置是否与已插入的皇后“冲突”
for(int j=0;j<pos;j++){ //pos记录了当前是第几个皇后,这里是遍历之前插入的皇后
if(queen[j]==i||pos-j==queen[j]-i||pos-j==i-queen[j]){ //检查是否同一行和同一斜线上
isok=false; //若冲突则置为false,退出检查
break;
}
}
if(isok==true){ //找到未冲突的位置
queen.push_back(i); //将当前的列数加入序列
if(pos==7){ //若皇后数量达到8个,输出到总记录
all.push_back(queen);
}else{
DFS(queen,pos+1); //皇后没到8个,则继续递归下去
}
queen.pop_back(); //重点!参数已传递到下层递归或总记录,这里应弹出刚刚尝试的列数,继续寻找其他可能的结果
}
}
}
int main(){
vector<int> queen; //记录当前序列
DFS(queen,0);
//for(int j=0;j<all.size();j++){ 这里注释的是输出所有的皇后序列,共92组,机试考试时可投机取巧,利用打表的手段降低时间空间复杂度
// for(int i=0;i<8;i++){
// printf("%d ",all[j][i]);
// }
// printf("\n");
//}
int n,num;
scanf("%d",&n); //题目要求输入n组数据
for(int k=0;k<n;k++){
scanf("%d",&num); /题目要求每组数据代表第n组皇后序列
for(int i=0;i<8;i++){
printf("%d",all[num-1][i]); //输出存放在总记录里的皇后序列
}
printf("\n");
}
return 0;
}