题目链接
题解:
八皇后问题,从第一行开始放皇后,每放一个就让行+1,直到八个全放完,这样保证了两个皇后不会再同一行,
定义一个数组记录每个皇后所在的列,关键在于如何判断两个皇后是否在同一斜线上,假设皇后1坐标(X1,Y1),皇后2坐标为(X2,Y2),如果|X1-X2|==|Y1-Y2|,那就说明两个皇后在同一斜线上。
两个for循环的想法,递归的是每一行,所以皇后可以放置在,它所在那一行的任何一列,然后要保证不会被其他皇后吃掉,所以就要与之前放过的列进行比较,看是否会被吃掉。
代码:
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
using namespace std;
int map[92][9],n,a[10],num=0;
void queen(int m)
{
int j;
if(m==9){
for(int i=1;i<9;i++)
map[num][i]=a[i];
num++;
return ;
}
for(int i=1;i<=8;i++){ //列
for(j=1;j<m;j++) //行
if(a[j]==i||abs(a[j]-i)==abs(j-m)) //找到合适的列
break;
if(j==m){
a[m]=i;
queen(m+1);
}
}
}
int main()
{
queen(1); //打表,把92中情况全保存下来
int m;
scanf("%d",&m);
while(m--){
scanf("%d",&n);
for(int i=1;i<9;i++)
printf("%d",map[n-1][i]);
printf("\n");
}
return 0;
}