八皇后问题 蔚落 2022-06-06 00:38 215阅读 0赞 ## 枚举法 ## #include<iostream> using namespace std; int a[9]; int check(int n,int a[]) { int i, j; for (int i = 1; i < n; i ++) { for (int j = i+1; j < n; j++) { if (a[i] == a[j] || abs(a[i] - a[j]) == abs(i - j)) //不同列,不同对角线(用两个坐标交换相减的绝对值) return 0; } } return 1; } int main() //爆搜八皇后 { for ( a[1] = 1; a[1] < 9; a[1]++) //八重嵌套循环 { for ( a[2] = 1; a[2] < 9; a[2]++) { for ( a[3] = 1; a[3] < 9; a[3]++) { for ( a[4] = 1; a[4] < 9; a[4]++) { for ( a[5] = 1; a[5] < 9; a[5]++) { for ( a[6] = 1; a[6] < 9; a[6]++) { for ( a[7] = 1; a[7] < 9; a[7]++) { for (a[8] = 1; a[8] < 9; a[8]++) { if (check(9, a) == 0) //检查函数 continue; else { for (int num = 1; num < 9; num++) { cout << a[num] << " "; } //goto abc; 可选择设置跳转找到一组数据后退出 } } } } } } } } } //abc: return 0; return 0; } 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 \*\* ## 算法二:加约束枚举 ## int a[9]; int check(int k) { int i; for (i = 1; i <= k-1; i++) { if ((abs(i - k) == abs(a[i] - a[k]))||(a[i] == a[k])) return 0; //return 1; } return 1; } int main() //加约束条件的爆搜八皇后 { for ( a[1] = 1; a[1] < 9; a[1]++) { for ( a[2] = 1; a[2] < 9; a[2]++) { if (check(2, a) == 0) //每层循环判断是否有冲突,有则跳过不再继续,大大减小时间复杂度 continue; for ( a[3] = 1; a[3] < 9; a[3]++) { if (check(3, a) == 0) continue; for ( a[4] = 1; a[4] < 9; a[4]++) { if (check(4, a) == 0) continue; for ( a[5] = 1; a[5] < 9; a[5]++) { if (check(5, a) == 0) continue; for ( a[6] = 1; a[6] < 9; a[6]++) { if (check(6, a) == 0) continue; for ( a[7] = 1; a[7] < 9; a[7]++) { if (check(7, a) == 0) continue; for (a[8] = 1; a[8] < 9; a[8]++) { if (check(9, a) == 0) //检查函数 continue; else { for (int num = 1; num < 9; num++) { cout << a[num] << " "; } //goto abc; 可选择设置跳转找到一组数据后退出 } } } } } } } } } //abc: return 0; return 0; } ——————————————————————————————————————————————————————————————————————————\*\* ## 算法三:非递归回溯法 ## > # include # > > using namespace std; > int a\[20\], n=8; //任意个皇后问题 > void ouput(int num) > \{ > for(int i = 1; i <= num; i++) // > cout << a\[i\] <<” “; > \} > int check(int k) //检查是否同列,同对角线 > \{ > int i; > for (i = 1; i <= k-1; i++) > \{ > if ((abs(i - k) == abs(a\[i\] - a\[k\]))||(a\[i\] == a\[k\])) > return 0; > //return 1; > \} > return 1; > \} > void find(int n) > \{ > int k; > a\[1\] = 0; > k = 1; > while (k>0) // 判断是否已经退到最后 > \{ > a\[k\] = a\[k\] + 1; > while ((a\[k\] <= n) && (check(k) == 0)) > a\[k\] = a\[k\] + 1; > if (a\[k\] <= n) //判断跳出原因是否为知道到放置点 > \{ > if (k == n) //再判断是否放满了n个皇后 > ouput(k+1); > else > \{ > k = k + 1; > a\[k\] = 0; > \} > \} > else //因为找不到放置点而跳出 > k = k - 1; //回滚一步 > \} > \} > void main() > \{ > //cin >> n; > find(n); > \}这里写代码片 ## 算法四:递归回溯 ## #include<iostream> using namespace std; int a[20],b[20],c[40],d[40], n,t,i,j,k; //任意个皇后问题,t记录解得个数,b记录列,c记录主对角线,d记录次对角线 void ouput() { t = t + 1; for(int i = 1; i <= n; i++) cout << a[i] <<" "; } void trya(int i) { int j; for (j = 1; j <= n; j++) { if ((b[j] == 0) && (c[i + j] == 0) && (d[i - j + n] == 0)) //判断是否冲突 { a[i] = j; //第i个皇后的位置 b[j] = 1; //设该列为占领 c[i + j] = 1;//占领主对角线 d[i - j + n] = 1; //占领次对角线 if (i < n) trya(i + 1); //递归进入下一层 else ouput(); b[j] = 0; //***若该层找不到位置清除占领信息 c[i + j] = 0; d[i - j + n] = 0; } } } void main() { cin >> n; for (i = 1; i <= n; i = i + 1) { b[i] = 0; c[i] = 0; c[n + i] = 0; d[i] = 0; d[n + i] = 0; } trya(1); cout << "次数为" << t << endl; }
相关 八皇后问题 八皇后问题 作者: Ackarlix 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯 1850 年提出:在 8X8 格的国际象棋上 灰太狼/ 2022年09月19日 15:20/ 0 赞/ 15 阅读
相关 八皇后问题 \include<stdio.h> \include<stdlib.h> \define max 8 int queen\[max\],s ﹏ヽ暗。殇╰゛Y/ 2022年08月07日 01:40/ 0 赞/ 176 阅读
相关 八皇后问题 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。试解出92种结果。 ![Cent 冷不防/ 2022年08月03日 00:49/ 0 赞/ 234 阅读
相关 八皇后问题 一、问题描述 ![Center][] 在8x8的国际棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能同一行、同一列、同一斜线上。 八皇后问题可以扩展为n ╰+哭是因爲堅強的太久メ/ 2022年07月14日 00:17/ 0 赞/ 197 阅读
相关 八皇后问题 回溯法求解八皇后问题 n皇后问题:n皇后问题是指在一个n\n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两不在同一行,同一列,同一条对角线上,求合法的方案数。 如 小灰灰/ 2022年06月11日 08:49/ 0 赞/ 260 阅读
相关 八皇后问题 枚举法 include<iostream> using namespace std; int a[9]; int check(int n, 蔚落/ 2022年06月06日 00:38/ 0 赞/ 216 阅读
相关 八皇后问题 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 由于皇后们是不能放在同一行的, 所以我们可以去掉“行”这个因素,即我第1次考虑把皇后放在第1行的某 柔情只为你懂/ 2022年05月28日 01:47/ 0 赞/ 219 阅读
相关 八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子.八皇后问题是这样一个问题:将八个皇后摆在一张8\8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇 Bertha 。/ 2022年05月18日 05:58/ 0 赞/ 215 阅读
相关 八皇后问题 include <iostream> include <cmath> include <cstring> using namespace std 港控/mmm°/ 2022年01月31日 00:29/ 0 赞/ 281 阅读
相关 八皇后问题 八皇后问题,以国际象棋为背景:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任意两个皇后都不能处于 叁歲伎倆/ 2021年09月25日 15:34/ 0 赞/ 446 阅读
还没有评论,来说两句吧...