n皇后问题:指在n*n的棋盘上摆放n个皇后,使得任意两个皇后不在同一行、同一列或同一斜线上,求解满足这种摆放方式的解有多少种。
代码:
#include<iostream>
#include<math.h>
using namespace std;
#define max 100
int x[max];
int n;//皇后数量
int sum = 0;//计算结解的个数
//判断即将放置的位置(row,col)是否满足
bool place(int row,int col){
for (int i = 1;i < row;i++){//比较之前row行已经放置的皇后
if(col == x[i] || abs(row-i) == abs(col - x[i]))//判断是否与之前的皇后处于同一列或同一对角线
return false;
}
return true;
}
//递归的回溯函数,若满足条件则向下递归,若不满足条件则向前回溯
void Backtrack(int t,int n){
if(t == n+1){//将棋盘遍历一次,形成一个解
for(int i=1;i<=n;i++){
if(i%n==1){//判断一种解是否已完,若已完则另起一行 记录下一个解
printf("\n");
}
printf("%d ",x[i]);//打印解
}
printf("\n");
sum++;
}
else{
for(int i = 1;i <= n;i++){
x[t] = i;
if(place(t,x[t])){//判断能否放置皇后
Backtrack(t + 1,n);//若能放置,则向下一行进行递归
}
}
}
}
int main(){
cout<<"请输入皇后的数量:";
cin>>n;
Backtrack(1,n);
cout<<"\n"<<"解的个数为:"<<sum<<endl;
return 0;
}
运行结果
请输入皇后的数量:5
1 3 5 2 4
1 4 2 5 3
2 4 1 3 5
2 5 3 1 4
3 1 4 2 5
3 5 2 4 1
4 1 3 5 2
4 2 5 3 1
5 2 4 1 3
5 3 1 4 2
解的个数为:10