关于N皇后的问题求解,我采用的是回溯法,在这里以4皇后问题为例。
4皇后即任意四个皇后都不能处于同一行,同一列或同一条斜线
回溯过程分析:
1.从空棋盘起,逐行放置棋子
2.每在一个布局中放下一个棋子,即推演到一个新的布局
3.如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子
数据结构分析:
二维数组A[N][N]存储皇后位置(若第i行,第j列放有皇后,则其为非零值,否则为0)
一维数组M[N],L[2*N],R[2*N]分别表示竖列,左斜线,右斜线是否放有皇后,有则为1,无则为0
源代码如下:
#include<iostream>
using namespace std;
int count=0;
const int N=4;
void print(int A[N][N]){
int ii,jj;
for(ii=0;ii<N;ii++){
for(jj=0;jj<N;jj++)
{cout<<A[ii][jj];}
cout<<endl;
}
cout<<endl;
}
int solve(int i,int M[N],int L[2*N],int R[2*N],int A[N][N]){
int j;
for(j=0;j<N;j++){
if(!M[j] && !L[i+j] && !R[i-j+N]){
A[i][j]=i+1;
M[j]=L[i+j]=R[i-j+N]=1;
if(i==N-1){
print(A);
cout<<endl;
count++;
}
else solve(i+1,M,L,R,A);
A[i][j]=0;
M[j]=L[i+j]=R[i-j+N]=0;
}
}
return count;
}
int main(){
int N=4;
int A[4][4];
int M[4];
int L[8];
int R[8];
int a,b;
for(a=0;a<N;a++){
for(b=0;b<N;b++)
A[a][b]=0;
M[a]=0;
}
for(a=0;a<2*N;a++){
L[a]=0;
R[a]=0;
}
count=solve(0,M,L,R,A);
cout<<count<<endl;
return 0;
}
小白第一次发文章,有啥不足请大佬多多指正
文中图片截取自湖南中医药大学刘伟老师智慧树的课件(如侵立删)
谢谢!!!