N皇后问题
N皇后问题
经典的回溯算法
// 判断当前棋子位置是否符合规则,是则返回1,否则返回0
// j:第j行,p[j]:当前q的位置
int judge(vector<int> &p, int j) {
for (int i = 0; i < j; ++i) {
if (p[j] == p[i]) //第i行第j行的q在同一列
return 0;
if (abs(p[j] - p[i]) == j - i)//第i行第j行的q在斜对角线,列-列=行-行
return 0;
}
return 1;
}
vector<vector<string> > NQueens(int n){
vector<vector<string> > res;
if (n == 1){
res = { { "Q" } };
return res;
}
vector<int> aa(n, 0);//一维表aa,aa[i]表示第i行的皇后放在这一行的哪个位置
for (aa[0] = 0; aa[0] < n; ++aa[0]){
int for_begin = 0;
int j = 1; //代表行数,从第一行开始
while (1){
int flag = 0;
for (aa[j] = for_begin; aa[j] < n; ++aa[j]){
if (judge(aa, j)){//如果存在可行的位置
++j;
flag = 1;
for_begin = 0;
break;
}
}
if (flag == 0){//flag==0 行j没有可行的位置,则回溯
--j;
for_begin = aa[j] + 1;//从上次放置的位置的下一个开始
}
if (j == n){ //最后一行
int m, nn;
vector<string> re;
for (m = 0; m < n; m++){
string r = "";
for (nn = 0; nn < n; nn++){
if (nn == aa[m]){
r += "Q";
}else{
r += ".";
}
}
re.push_back(r);
}
res.push_back(re);
j = j - 2;//?
for_begin = aa[j] + 1;
}
if (j == 0) break;
}
}
return res;
}