N 皇后问题
1、查找第一行,从左往右查找,发现合适的位置,放下第一个皇后
2、查找第二行,从左往右查找,发现合适的位置,放下第二个皇后
3、查找第三行,从左往右查找,发现合适的位置,放下第三个皇后
假设要在m行k列放置一个皇后,只需要查看第一行到m-1行就行。如果k列已经存在皇后,那么m行k列这个位置就不适合了,如果这个位置的对角线上有其他皇后了,同样这个位置也不适合了。
注意:回溯时可能会会错,因为可能会把之前的占得格回溯,所以用int类型,用加减来反映
#include<bits/stdc++.h>
using namespace std;
int n,b[110],flag,bj,bjj;//hangsss liei
int a[100][100];
void ss(int sss){
if(sss==n){
for(int i=1;i<=n;i++){
printf("%5d",b[i]);
}
flag++;
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(a[sss+1][i]==1){
bj=sss+2;
b[sss+1]=i;
for(int j=sss+2;j<=n;j++)
a[j][i]++;
for(int j=i+1;j<=n;j++){
if(bj<=n){
//cout<<bj<<" "<<j<<endl;
a[bj][j]++;
bj++;
}
else{
break;
}
}
bj=sss+2;
for(int j=i-1;j>=1;j--){
if(bj<=n){
a[bj][j]++;
bj++;
}
else{
break;
}
}
ss(sss+1);
bjj=sss+2;
for(int j=sss+2;j<=n;j++){
a[j][i]--;
}
for(int j=i+1;j<=n;j++){
if(bjj<=n){
a[bjj][j]--;
bjj++;
}
else{
break;
}
}
bj=sss+2;
for(int j=i-1;j>=1;j--){
if(bj<=n){
a[bj][j]--;
bj++;
}
else{
break;
}
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=1;
}
}
ss(0);
if(flag==0){
cout<<"no solute!";
}
}
浙公网安备 33010602011771号