八皇后问题的简单分析

八皇后问题是一个以国际象棋为背景的问题:

如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

基本思路:将棋盘分为8行,每一行填充一个棋子,这样就能保证每一行不冲突,具体到每一行的话,又分为8种可能,显然用递归的方式很容易就实现。

数据结构:一个8乘8的数组(0表示无棋子,1表示有棋子),具体实现的时候有两个要注意的地方:1.判断合法性:每一列需要判断,还有就是对角线上也需要判断2.在每一行选择将数组的某一个位置置为1后,要在下一次选择前将该位置重新置为0,(函数的压栈和弹栈是自动完成的,但是像这种情况需要手动完成)。

 

具体代码:

#include <iostream> #include <stdlib.h>
using namespace std; int data[8][8]={0}; int countl=0; //分治法:分成8行,每一行又分为8小格

void Print(){ cout<<++countl<<endl; for(int i=0;i<8;i++){ for(int j=0;j<8;j++) cout<<data[i][j]<<" "; cout<<endl; } cout<<endl; } int Is_Legal(int i,int j){//合法返回1
   for(int k=0;k<i;k++) for(int p=0;p<8;p++) if(data[k][p]==1){ if(p==j||abs(i-k)==abs(j-p)) return 0; } return 1; } void deal(int i){ if(i>=8){ Print(); } else{//每一行又有8种选择
     for(int j=0;j<8;j++){ data[i][j]=1; if(Is_Legal(i,j)) deal(i+1); data[i][j]=0; } } } int main() { deal(0); return 0; }

 

    原文作者:哦摩西罗伊
    原文地址: https://www.cnblogs.com/mlgjb/p/6878703.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞