八皇后问题:
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; }