/**********************************************/
/* n皇后问题 */
/*自顶向下,路径上数值和最大,输出最大值及路径*/
/**********************************************/
#include<iostream>
using namespace std;
int main(){
/*函数声明*/
void show_x(int x[], int n);
bool place(int x[], int k);
void n_queens(int count, int n, int x[]);
int n;
cout << "这是一个几后问题,请输入一个数字:";
cin >> n;
int count = 0; //解个数赋初值0
int *x = new int[n+1];
cout << "\n"<<n<<"皇后问题的解向量分别为:\n" ;
n_queens(count,n,x); //n皇后 回溯法求解 解向量
system("pause");
return 0;
}
/*打印解向量*/
void show_x(int x[], int n){
cout << x[1];
for (int i = 2; i <= n; i++)
cout << "->" << x[i];
cout << endl;
}
/*判断当前所得到的解向量是否满足问题的条件*/
bool place(int x[], int k){
for (int i = 1; i < k; i++){
if ((x[i] == x[k]) || (abs(x[i] - x[k]) == abs(i - k)))
return false;
}
return true;
}
/*n皇后 回溯法求解 解向量*/
void n_queens(int count,int n, int x[]){
int k = 1;
x[1] = 0;
while (k > 0){
x[k] = x[k] + 1; //从当前列加1的位置开始搜索
while ((x[k] <= n )&& (!place(x,k)))//判断当前列位置是否满足条件
x[k] = x[k] + 1; //不满足,继续搜索下一列位置
if (x[k] <= n){ //存在满足条件的列
if (k == n){ //如果是最后一个皇后
show_x(x, n); count++; //打印此解,并统计个数
}
else{
k++; x[k] = 0; //不是,则处理下一行皇后
}
}
else{
x[k] = 0; k--; //第k行复位为0,回溯到前一行
}
}
cout << "共有" << count << "个解!\n\n";
}
12-20
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交