回溯法-N皇后问题-C++算法
- N皇后问题要求:
在一个N×N的矩阵中,任意两个皇后不能同行、不能同列或不能位于同一条对角线上。
- 算法思路:
按照每一行对单个皇后位置进行遍历,此时限制条件转变为了不能同列或不能位于同一条对角线。
以此为限制条件实现回溯,当满足达到最后一行时输出当前结果。
- 代码实现:
#include <iostream>
using namespace std;
void Select(int **pos, int n, int num);
int main (){
int num; //皇后数
cin >> num;
int **pos; //皇后摆放矩阵
pos = new int *[num];
for(int i =0; i<num; i++){
pos[i] = new int [num];
for(int j =0; j<num; j++)
pos[i][j]= 0;
}
Select(pos,1,num);
}
void Select(int **pos, int n, int num){
if(n<=num){
for(int i = 0; i<num; i++){ //每一行进行遍历
bool flag = false;
for(int j = 1; j<n; j++){
if(pos[n-1-j][i] || ((i-j>=0)&&(pos[n-1-j][i-j])) || (i+j<num)&&(pos[n-1-j][i+j])){ //回溯条件,判断同一列 ||左上方 ||右上方
flag = true;
break;
}
}
if(!flag && n==num){ //最后一行输出结果
pos[n-1][i] = 1;
for(int i = 0; i<num; i++){
for(int j = 0; j<num; j++){
cout << pos[i][j] << " ";
}
cout <<endl;
}
cout <<endl;
pos[n-1][i] = 0;
return;
}
if(!flag && n<num){ //无冲突判断下一皇后
pos[n-1][i] = 1;
Select(pos,n+1,num);
pos[n-1][i] = 0;
}
}
}
}

浙公网安备 33010602011771号