zoukankan      html  css  js  c++  java
  • 八皇后问题的简单分析

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

    如何能够在 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;
    }

     

  • 相关阅读:
    BZOJ2762: [JLOI2011]不等式组
    BZOJ1452: [JSOI2009]Count
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)
    BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ2730: [HNOI2012]矿场搭建
    Flask实现异步非阻塞请求功能
    在flask中使用websocket-实时消息推送
    Python数据库连接池DBUtils
    flask请求上下文
    scanf与getchar
  • 原文地址:https://www.cnblogs.com/mlgjb/p/6878703.html
Copyright © 2011-2022 走看看