码迷,mamicode.com
首页 > 其他好文 > 详细

8皇后问题

时间:2020-03-04 12:38:08      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:==   div   bool   clu   八皇后   dfs   iostream   没有   strong   

八皇后问题:

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;
}
 

 

8皇后问题

标签:==   div   bool   clu   八皇后   dfs   iostream   没有   strong   

原文地址:https://www.cnblogs.com/xusi/p/12408693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!