八皇后问题-递归

问题

在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;
}
点赞