n皇后问题

简介: n皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

典型的回溯法问题

思路:

尝试性的放置 ,从第一行开始,接着在下一行放置,(这里的好处就是不需要考虑行了,只需要考虑列和对角线)
一直纠结第一行的问题,代码中直接传参数为0,一直好奇如何控制第一行的列的变化,后来将0自己模拟走了一遍才明白。
注意判断的是否符合规则的公式:(列==列)(abs(列-列)==abs(行-行))
具体细节见注释(仔细阅读,一定能看懂,)
#include<iostream>
#include <math.h>
#define N 8
using namespace std;
int num=0;//用来记录总的放置个数
int cur[8];//此全局变量是用来记录第i行放在得第j列,其中下标为i,值为j
int check(int n){//传进来行
    for(int i=0;i<n;i++){
        if(cur[i]==cur[n]||abs(n-i)==abs(cur[n]-cur[i])){//判断当前放置的位置是否与之前的放置位置是否在同一列或同斜列
            return 0;
        }
    }
    return 1;
}
void putQueen(int n){
    if(n==N){//如果找到了最后一行的下一行,那么就可以将次数+1了(就是之前把所有的行已经放完了,数组下标从0开始的勿忘)
        num++;
    }else{
        for(int j=0;j<N;j++){//列的位置从0往最后放置
            cur[n]=j;//记录下当前行的当前列
            if(check(n)){//判断当前放置的行列是否合适
                putQueen(n+1);//开始进行下一行的放置
            }
        }
    }
}
int main(){
    putQueen(0);
    cout<<num;
    return 0;
}

相关文章
|
1月前
lanqiao OJ 664 方格填数
lanqiao OJ 664 方格填数
11 1
|
机器学习/深度学习 算法
杨氏矩阵
杨氏矩阵
27 0
|
6月前
|
机器学习/深度学习
N皇后问题(HDU—2253)
N皇后问题(HDU—2253)
|
机器学习/深度学习
【N皇后】
【N皇后】
|
机器学习/深度学习
N皇后问题
N皇后问题
80 0
洛谷P1162 填涂颜色——广搜
洛谷P1162 填涂颜色——广搜
75 0
从杨氏矩阵找数
杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)。
AcWing——方格迷宫(有点不一样的迷宫问题)
AcWing——方格迷宫(有点不一样的迷宫问题)
90 0
|
机器学习/深度学习 算法 Java
|
机器学习/深度学习 算法
【回溯算法篇】N皇后问题
【回溯算法篇】N皇后问题
【回溯算法篇】N皇后问题