思路1:将棋盘上的位置用不同的记号进行标记
1代表皇后摆放的位置
0表示还未被摆放的位置
-1表示不能被摆放的位置
每一行去搜寻是否有0的位置可以摆放
当某一位置摆放上皇后时,将位置存在相应行的res[]里,并把该位置以下的同列、主副对角线都标记上-1
若无位置摆放,则返回上一行,搜寻下一位置
若n行都已摆放,则输出,返回上一行,搜寻下一位置
#include <stdio.h>
#include <string.h>
#include <math.h>
void set(int num[25][25],int row,int len,int res[])
{
int i;
//当全部摆放完成
if(row==len)
{
for(i=0;i<len;i++) printf("%d",res[i]+1);
printf("\n");
//还原到上一步,将之前的不能摆放的标记再重复一次
memset(num,0,2500);
for(int j=0;j<row-1;j++)
{
for(int m=j+1;m<len;m++) num[m][res[j]]=-1;
for(int m=j+1,n=res[j]+1;m<len,n<len;m++,n++) num[m][n]=-1;
for(int m=j+1,n=res[j]-1;m<len,n>=0;m++,n--) num[m][n]=-1;
}
return;
}
for(i=0;i<len;i++)
{
if(num[row][i]==0)
{
res[row]=i;//将位置存在res里
//对不能摆放的位置进行标记
for(int m=row+1;m<len;m++) num[m][i]=-1;
for(int m=row+1,n=i+1;m<len,n<len;m++,n++) num[m][n]=-1;
for(int m=row+1,n=i-1;m<len,n>=0;m++,n--) num[m][n]=-1;
set(num,row+1,len,res);//摆放下一行
}
}
//当某一行都不能摆放时
if(i==len)
{
//还原至上一步的状态,将之前的不能摆放的标记再重复一次
memset(num,0,2500);
for(int j=0;j<row-1;j++)
{
for(int m=j+1;m<len;m++) num[m][res[j]]=-1;
for(int m=j+1,n=res[j]+1;m<len,n<len;m++,n++) num[m][n]=-1;
for(int m=j+1,n=res[j]-1;m<len,n>=0;m++,n--) num[m][n]=-1;
}
return;
}
}
int main()
{
int n;
scanf("%d",&n);
int num[25][25],res[25];
memset(num,0,sizeof(num));
set(num,0,n,res);
return 0;
}
思路2:与思路1相似,只是思路1是用记号标记不同位置
而思路2不进行标记,直接将某位置与已摆放的皇后位置进行比较,是否在同列或对角线上(对角线比较方法:行差=列差)
满足要求则存在res[]中,否则进行搜寻下一位置
#include <stdio.h>
void queen(int row,int len,int res[])
{
if(row==len)
{
for(int i=0;i<len;i++) printf("%d",res[i]+1);
printf("\n");
return;
}
for(int i=0;i<len;i++)
{
int j;
for(j=0;j<row;j++)
//与前几个位置比较(同列或斜对角:列差等于行差)
if(res[j]==i||row-j==abs(res[j]-i)) break;
if(j==row)
{
res[row]=i;
queen(row+1,len,res);
}
}
}
int main()
{
int n;
scanf("%d",&n);
int res[25];
queen(0,n,res);
return 0;
}
#include <iostream>
using namespace std;
int res[14];
void setqueen(int x, int row);
int main () {
int n;
cin >> n;
setqueen(n, 1);
return 0;
}
void setqueen(int x, int row) {
if (row > x) {
for(int i = 1; i <= x; i++) cout << res[i];
cout << endl;
return;
}
for (int i = 1; i <= x; i++) {
int j;
// 判断该位置是否可以放置皇后
for (j = 1; j < row; j++) {
if(res[j] == i || abs(i - res[j]) == row - j) break;
}
if (j == row) {
res[row] = i;
setqueen(x, row + 1);
}
}
return;
}