八皇后问题 小灰灰 2022-06-11 08:49 286阅读 0赞 **回溯法求解八皇后问题** n皇后问题:n皇后问题是指在一个n\*n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两不在同一行,同一列,同一条对角线上,求合法的方案数。 如下图是N=5的情况,其中图(a)是一个合法的方案,而图(b)由于有两个皇后在同一条对角线上,因此不是合法的方案。 ![Center][] ![Center 1][] ![Image 1][] ![Image 1][] (a) (b) 对于这个问题,如果采用组合数的方式来枚举每一种情况(从n\*n个位置中选择n个位置),那么将需要 ![Center 2][] 的枚举量,当n=8时,就是54502232次枚举,如果n很大,那么就会无法承受。 但是换个思路,考虑到每行只能放置一个皇后,每列也只能放置一个皇后,那么如果把n列皇后所在的行号依次写出,那么就会是1~n的一个排列。 对于图(a)来说对应的排列是24135,对于图(b)来说就是35142。 于是就只需要枚举1~n的所有排列,查看每个排列对应的方案是否合法,统计合法的方案即可。由于一共有n!个排列,因此当n=8时,需要40320次枚举,该算法比之前优秀很多。 于是可以在全排列的基础上进行求解。生成一个全排列,只需要判断两两皇后是否在同一条对角线上(不在同一行、同一列是显然的)。代码如下: #include <iostream> #include <vector> using namespace std; /*回溯法求解n皇后问题*/ /*该问题可以归结为全排列问题,即对数字1-8进行全排列,在所有全排列中选择合法的全排列*/ void generateP(int n, int index, int p[], bool HashTable[], int &count) { /* param n: 皇后的个数 index: 当前皇后所在的列号(1 <= index <= n) p: 用来表示当前n皇后的摆放位置 HashTable: 表示某个位置是否已经放置皇后 count: 合法放置的个数 */ if (index == n + 1) { //递归边界,生成一个合法的方案 count++; for (int i = 1; i <= n; ++i) //显示出合法方案 cout << p[i] << " "; cout << endl; return; } for (int x = 1; x <= n; ++x) { //第x行,相当于皇后编号 if (HashTable[x] == false) { //第x行还没有皇后 bool flag = true; //flag为true表示当前皇后不会和之前的皇后冲突 for (int pre = 1; pre < index; ++pre) { //遍历之前的皇后,index是当前列 if (abs(index - pre) == abs(x - p[pre])) { //这里只需要判断是否在一条对角线上即可,因为转换为全排列,不可能在同一行或同一列 flag = false; //与之前的皇后在一条对角线,冲突 break; } } if (flag) //如果可以把皇后放在第x行 { p[index] = x; //令第index列皇后的行号为x HashTable[x] = true; //第x行被占用 generateP(n, index + 1, p, HashTable, count); //递归处理第index+1行皇后 HashTable[x] = false; //递归完毕,还原第x行为未占用 } } } } int main() { const int n = 8; int p[n + 1]; bool HashTable[n + 1] = { false }; int count = 0; generateP(n, 1, p, HashTable, count); cout << count << endl; } 输出结果为92。 [Center]: https://img-blog.csdn.net/20170803163710733?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUZfTGkxMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center [Center 1]: /images/20220611/8c7f10ef965b4c06a98cdb363aa267d7.png [Image 1]: [Center 2]: /images/20220611/3cb63a422e854ab7b7bb000063d5fb4f.png
相关 八皇后问题 八皇后问题 作者: Ackarlix 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯 1850 年提出:在 8X8 格的国际象棋上 灰太狼/ 2022年09月19日 15:20/ 0 赞/ 46 阅读
相关 八皇后问题 \include<stdio.h> \include<stdlib.h> \define max 8 int queen\[max\],s ﹏ヽ暗。殇╰゛Y/ 2022年08月07日 01:40/ 0 赞/ 202 阅读
相关 八皇后问题 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。试解出92种结果。 ![Cent 冷不防/ 2022年08月03日 00:49/ 0 赞/ 276 阅读
相关 八皇后问题 一、问题描述 ![Center][] 在8x8的国际棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能同一行、同一列、同一斜线上。 八皇后问题可以扩展为n ╰+哭是因爲堅強的太久メ/ 2022年07月14日 00:17/ 0 赞/ 230 阅读
相关 八皇后问题 回溯法求解八皇后问题 n皇后问题:n皇后问题是指在一个n\n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两不在同一行,同一列,同一条对角线上,求合法的方案数。 如 小灰灰/ 2022年06月11日 08:49/ 0 赞/ 287 阅读
相关 八皇后问题 枚举法 include<iostream> using namespace std; int a[9]; int check(int n, 蔚落/ 2022年06月06日 00:38/ 0 赞/ 240 阅读
相关 八皇后问题 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 由于皇后们是不能放在同一行的, 所以我们可以去掉“行”这个因素,即我第1次考虑把皇后放在第1行的某 柔情只为你懂/ 2022年05月28日 01:47/ 0 赞/ 250 阅读
相关 八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子.八皇后问题是这样一个问题:将八个皇后摆在一张8\8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇 Bertha 。/ 2022年05月18日 05:58/ 0 赞/ 238 阅读
相关 八皇后问题 include <iostream> include <cmath> include <cstring> using namespace std 港控/mmm°/ 2022年01月31日 00:29/ 0 赞/ 307 阅读
相关 八皇后问题 八皇后问题,以国际象棋为背景:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任意两个皇后都不能处于 叁歲伎倆/ 2021年09月25日 15:34/ 0 赞/ 475 阅读
还没有评论,来说两句吧...