问题
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路
八皇后可以使用8层循环,考虑使用递归解决。每个皇后肯定都在单独都一列,否则就在同一行了。则对于每个皇后只需要记录一维座标。按顺序确定每一个皇后的位置就行。倒有点枚举的意思,确定第一个皇后,后面都能依次确定。
如果是用循环解决,就是八层循环,每层循环便利所有位置,找到可以落子的位置后,进行下一层循环。
代码中矩阵是转置输出,和题目要求有关。
#include<stdio.h>
#include <cstdlib>
using namespace std;
int chess[8][8];
int que[8];
int count = 0;
int N=8;
int suit(int n,int j){
int flag =1,i;
for(i=0;i<n;i++){
if(que[i] ==j || abs(i-n) == abs(que[i]-j) ){
flag = 0;
break;
}
}
return flag ;
}
void p(){
int i=0 ,j=0;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%d ",chess[j][i]);
}
printf("\n");
}
}
void q(int n){
int i;
if(n == N){
printf("No. %d\n",++count);
p();
return ;
}
for(i=0;i<N;i++){
if(suit(n,i)){
//printf(" %d %d \n",n,i);
chess[n][i] = 1;
que[n] = i;
q(n+1);
chess[n][i] = 0;
que[n] = 0;
}
}
}
int main(){
q(0);
return 0;
}