八皇后 女爷i 2022-07-29 10:52 205阅读 0赞 八皇后问题是一个古老而著名的问题,是**回溯算法**的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 # 算法中检测冲突方法的分析 # NxN棋盘,用a\[m\]=n(m <= N, n<=N)来表示第m个皇后在棋盘上的n行m列。 1 每个皇后的索引m都不同,皇后在同一列发生冲突的情况不存在。 2 判断皇后是否在同一行n 3 判断皇后是否在两个对角线方向 // 只检查第1列到第n列(n <= N),因为n列以后还没有进行皇后位置排布,不必检查 public static boolean Check(int a[], int n) { for (int i = 1; i < n; i++) { // 只检测皇后是否在两个对角线方向和是否在同一行 if (Math.abs(a[i]-a[n])==Math.abs(i-n) || a[i] == a[n]) return false; } return true; } # 算法的实现 # // 简单粗暴的算法 public class eightQueens { public static void main(String[] args) { int a[] = new int [9]; int i, t = 1; // a[m] = n 即把第m个皇后放在第n列 for (a[1] = 1; a[1] < 9; a[1]++) { for (a[2] = 1; a[2] < 9; a[2]++) { if (!Check(a, 2)) continue; for (a[3] = 1; a[3] < 9; a[3]++) { if (!Check(a, 3)) continue; for (a[4] = 1; a[4] < 9; a[4]++) { if (!Check(a, 4)) continue; for (a[5] = 1; a[5] < 9; a[5]++) { if (!Check(a, 5)) continue; for (a[6] = 1; a[6]< 9; a[6]++) { if (!Check(a, 6)) continue; for (a[7] = 1; a[7] < 9; a[7]++) { if (!Check(a, 7)) continue; for (a[8] = 1; a[8] < 9; a[8]++) { if (!Check(a, 8)) continue; else { System.out.format("第%d种解法:\n", t++); for (i=1; i < 9; i++) System.out.format("第%d个皇后:%d\n", i, a[i]); System.out.println("\n"); } } } } } } } } } } // 只检查第1列到第n列,因为n列以后还没有进行皇后位置排布,不必检查 public static boolean Check(int a[], int n) { for (int i = 1; i < n; i++) { if (Math.abs(a[i]-a[n])==Math.abs(i-n) || a[i] == a[n]) return false; } return true; } } // 回溯法 // a[m]=n 表示第m个皇后在棋盘的第n行 public class eightQueens2 { public static void main(String[] args) { int a[] = new int[256]; // 数组默认初始化为0 int j, N, t = 1; System.out.println("请输入皇后个数:"); Scanner sc = new Scanner(System.in); N = sc.nextInt(); int i = 1; // 第i个皇后 while (i > 0) { // 当所有的位置被找出来后,表示皇后i为-1,结束循环 for (a[i]++; a[i] <= N; a[i]++) { if(Check(a, i)) // 检查前i列有有无冲突 break; } if (a[i] <= N) { if (i == N) { // 找出一组解输出 System.out.format("第%d种解法:\n", t++); for (j = 1; j <= N; j++) { System.out.format("第%d个皇后:%d\n", j, a[j]); } System.out.println(""); } else { // 未找完 i++; a[i] = 0; } } else { // 回溯,回到上一个皇后的情况,重新给上一个皇后找合适的位置 i--; } } } // 只检查第1列到第n列,因为n列以后还没有进行皇后位置排布,不必检查 public static boolean Check(int a[], int n) { for (int i = 1; i < n; i++) { if (Math.abs(a[i]-a[n])==Math.abs(i-n) || a[i] == a[n]) return false; } return true; } } // 使用递归方式 public class eightQueens3 { static int a[] = new int[20]; static int N, i, j, t =1; public static void main(String [] args) { System.out.println("几皇后? N="); Scanner sc = new Scanner(System.in); N = sc.nextInt(); Try(1); } // 每个皇后都检测是否与前面的皇后冲突,当都不冲突时,继续找下一个皇后的位置,找到最后一个皇后时,打印所有皇后位置, public static void Try(int i) { int j, k; for (j = 1; j <= N; j++) { a[i] = j; if (Check(a, i)) { if (i < N) Try(i+1); // 该皇后与前面的皇后不冲突,则找下一个皇后的位置 else { System.out.format("第%d种解法:\n", t++); for (k = 1; k <= N; k++) System.out.format("第%d个皇后:%d\n", k, a[k]); System.out.println(""); } } } } // 只检查第1列到第n列,因为n列以后还没有进行皇后位置排布,不必检查 public static boolean Check(int a[], int n) { for (int i = 1; i < n; i++) { if (Math.abs(a[i]-a[n])==Math.abs(i-n) || a[i] == a[n]) return false; } return true; } } /* 递归:递好找,重点是归 * 嵌套函数的调用,包括同名函数的调用,主要是栈的使用 * 如果是同名函数的嵌套调用又叫递归 * 数据结构中栈的应用:先进后出的理念 * */
相关 八皇后 八皇后问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不 ゝ一世哀愁。/ 2022年12月24日 12:57/ 0 赞/ 122 阅读
相关 八皇后 八皇后 求解思路 可以将八皇后看成全排列问题,因为每次都是在某一行选择某个位置,所以不需要考虑行的问题。每次只需要求出当前行的棋子所在列。所以可以化为全排列问 左手的ㄟ右手/ 2022年10月01日 11:44/ 0 赞/ 172 阅读
相关 八皇后 / Queen 八皇后问题 :递归实现 1. 从第一行开始递归 2. 然后枚举当前行中的每一列, 3. 如果可以 r囧r小猫/ 2022年08月24日 14:25/ 0 赞/ 186 阅读
相关 八皇后 编写出八皇后的算法->递归算法 include <stdio.h> int nCount=0; int noDanger(int row,int 深藏阁楼爱情的钟/ 2022年08月08日 05:15/ 0 赞/ 19 阅读
相关 八皇后 八皇后问题是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇 女爷i/ 2022年07月29日 10:52/ 0 赞/ 206 阅读
相关 八皇后 package 搜索; import java.io.BufferedReader; import java.io.IOException; 一时失言乱红尘/ 2022年07月12日 12:14/ 0 赞/ 192 阅读
相关 八皇后问题 回溯法求解八皇后问题 n皇后问题:n皇后问题是指在一个n\n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两不在同一行,同一列,同一条对角线上,求合法的方案数。 如 小灰灰/ 2022年06月11日 08:49/ 0 赞/ 274 阅读
相关 八皇后问题 枚举法 include<iostream> using namespace std; int a[9]; int check(int n, 蔚落/ 2022年06月06日 00:38/ 0 赞/ 228 阅读
相关 八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子.八皇后问题是这样一个问题:将八个皇后摆在一张8\8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇 Bertha 。/ 2022年05月18日 05:58/ 0 赞/ 226 阅读
相关 八皇后问题 八皇后问题,以国际象棋为背景:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任意两个皇后都不能处于 叁歲伎倆/ 2021年09月25日 15:34/ 0 赞/ 460 阅读
还没有评论,来说两句吧...