zoukankan      html  css  js  c++  java
  • 搜索 八皇后问题

    八皇后问题:

    问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

    搜索经典题。

    难的点在于想出对角线的标记。

    首先在棋盘上建立坐标(i,j);

     

    可以放斜率为正(从左下到右上的直线  /

    发现从左上到右下斜线排列的顺序,可以用 i + j 进行标记

    0,1,2,3,4,5,6,7,8,9...12,13

    那么类似的,我们可以推出 i - j

     7.6,5,4,3,2,1,0,-1 .. -6,-7

    #include <iostream>
    using namespace std;
    
        int ans = 0;
        const int MAXN = 8;
        bool row[MAXN],x1[MAXN*2],x2[MAXN*2];
        
    bool check(int c,int i){//检测是否在对角线以及这行有皇后 
        return !row[i] && !x1[c+i] && !x2[c-i+MAXN];
    }
    
    void dfs(int c){//在c行i列放皇后 
        if(c == 8){
            ans++;
            return;
        }
        for(int i=0;i<8;++i){
            if(check(c,i)){
                row[i] = x1[c+i] = x2[c-i+MAXN] = true;
                dfs(c+1);
                row[i] = x1[c+i] = x2[c-i+MAXN] = false;
            }
        }
    }
    int main() {
        dfs(0);
        cout << ans << endl;
        return 0;    
    }
  • 相关阅读:
    0802作业1替换文本文件内容

    看病
    爬山
    作业1
    超市(未完成)
    图片复制
    替换
    文件
    英文字母和中文汉字在不同字符集编码下的字节数
  • 原文地址:https://www.cnblogs.com/--zz/p/10501134.html
Copyright © 2011-2022 走看看