zoukankan      html  css  js  c++  java
  • 8皇后问题

    八皇后问题:

    8皇后的规则就是不能有任何棋子同行或者同列或者同斜线,在满足这个规则的同时,计算一共用多少种方法,把8个棋子放在8*8的棋盘上

    知识点:

    正对角线的规律 x+y = 定值
    负对角线的规律 x- y = 定值

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAX = 6e5 + 5; 
                                             //col[i]表示i列 x1[i]表示斜率为正的对角线 x2[i]表示斜率为负的对角线 
    int col[10],x1[20],x2[20];               //对于斜率为正的对角线 上面每个元素的 行+列=定值 
    int ans;                                 //对于斜率为负的对角线 上面每个元素的 行-列=定值 
    bool check(int r,int i){                 //(为防止数组越界判断x2[r-i+n] 若r-i为负数 r-i+8为正可以保证不会越界 当r+i为正时 不会和之前 r-i为负时的情况有重复情况) 
        return !col[i]&&!x1[r+i]&&!x2[r-i+8]; //判断r,i元素的所在列 正对角线 负对角线没有被占用 
    }
    void dfs(int r){
        if(r==8){
            ans++;
            return;
        }
        for(int i=0;i<8;i++){               //因为有数组记录列的占用情况,需要记录每一种可能的情况,所以列判断从0开始 
            if(check(r,i)){
                col[i]=x1[r+i]=x2[r-i+8]=1;
                dfs(r+1);                   //因为判断没有有数组记录行的占用情况 所以每次从r+1 开始dfs 则每行不会重复占用 
                col[i]=x1[r+i]=x2[r-i+8]=0; 
            }
        }
    }
    int main()
    {    
        dfs(0);
        cout<<ans;
        return 0;
    }
     
  • 相关阅读:
    C++并发编程实战---阅读笔记
    设计模式---命令模式
    图解HTTP(六)HTTP首部
    HTTP 状态码
    使用VS2012调试Dump文件
    如何设置C++崩溃时生成Dump文件
    boost::asio::io_service类
    boost::asio 同步&异步例子
    boost::bind
    c++并发编程之原子操作的实现原理
  • 原文地址:https://www.cnblogs.com/xusi/p/12408693.html
Copyright © 2011-2022 走看看