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;
}
 
原文地址:https://www.cnblogs.com/xusi/p/12408693.html