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;
    }
     
  • 相关阅读:
    k近邻 KNN
    聚类之k-means
    支持向量机SVM、优化问题、核函数
    [THUSC 2016] 补退选 (Trie树)
    [CQOI2016] 手机号码 (数位dp)
    [CQOI2012] 交换棋子 (费用流)
    [SCOI2016] 背单词 (Trie树)
    [JSOI2009] 球队收益 (费用流)
    [BZOJ1878][SDOI2009] HH的项链 (树状数组)
    [BZOJ2151]种树
  • 原文地址:https://www.cnblogs.com/xusi/p/12408693.html
Copyright © 2011-2022 走看看