八皇后问题(递归的使用)

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
则思路是:

(1)从第一行开始,从第一行第一列开始摆放,判断“后”是否安全。

(2)若安全则进入下一行,否则进入下一列。

(3)判断的方法是有三个方向:(3.1)左上角,(3.2)正上方,(3.2)右上方。

(4)若下一行八个位子都不可以则退回上一行进行上一行的调整。

(5)需要注意的是:程序只需要考虑那一行的事情,不必要考虑下一行的事。

核心代码:

#include <stdio.h>

#include "eightQueen.h"

void orderQueen(int (*chessboard)[ORDER], const int row) {
    // 在当前行只需要考虑当前行!
    // 若当前行行号已经是ORDER了,意味着,前面ORDER行已经成功!
    static int count = 0;
    
    if (row >= ORDER) {
        ++count;
        drawChessboard(chessboard);
    } else {
        int col;
        
        for (col = 0; count < 23 && col < ORDER; col++) { // 尝试每一列
            chessboard[row][col] = 1;        // 放置皇后
            if (isSafe(chessboard, row, col)) { // 若本行本列是安全的
                orderQueen(chessboard, row + 1); // 放置下一行
            }
            chessboard[row][col] = 0;        // 无论本行列是安全或者不安全的,
            // 都需要去掉本位置的皇后!因为,下列需要放置一个皇后!
        }
    }
}

void drawChessboard(int (*chessboard)[ORDER]) {    //输出最终的结果。
    int row;
    int col;
    static int count = 0;
    
    printf("第%d个解:\n", ++count);
    for(row = 0; row < ORDER; row++) {
        for(col = 0; col < ORDER; col++) {
            printf("%2d", chessboard[row][col]);
        }
        printf("\n");
    }
}
    
boolean isSafe(int (*chessboard)[ORDER], const int row, const int col) {
    int i;
    int j;
    
    for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {   //判断左上角是否安全!
        if (chessboard[i][j] == 1) {
            return FALSE;
        }
    }
    for (i = row - 1, j = col; i >= 0; i--) {            //判断上方是否是安全的!
        if (chessboard[i][j] == 1) {
            return FALSE;
        }
    }
    for(i = row - 1, j = col + 1; i >= 0 && j < ORDER; i--, j++) {        //判断右上角是否是安全的!
        if (chessboard[i][j] == 1) {
            return FALSE;
        }
    }
    
    return TRUE;
}

主函数代码:
#include <stdio.h>
 #include "./include/eightQueen.h;
int main() {
    int chess[ORDER][ORDER] = { 0 };
    orderQueen(chess, 0);
    return 0;
}

原文地址:https://www.cnblogs.com/youdiaodaxue16/p/9098120.html

时间: 2024-08-04 20:17:55

八皇后问题(递归的使用)的相关文章

八皇后问题——递归+回溯法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 求解过程: 采用遍历的办法,就是采用将每种情况都验证的办法最终找出问题的解,但是蛮力遍历的话,需要遍历的数据量太大,计算时间花费太大,所以在遍历

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

八皇后问题递归代码

听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题. 怎么说呢,感觉有点像搜索的做法. #include<stdio.h> int count=0; //row行,j列: int notDanger(int row,int j,int (*chess)[8]){ int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; //注意这里row与j不能直接使用: //判断列的方向有无危险: for(i=0;i<8;i++){ if(*(*(chess+

八皇后问题 递归实现 C语言 超详细 思路 基础

八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去,肯定最终每行只有一个皇后,每列只有一个皇后. 2.设个二维数组chess [ i ] [ j ] 模拟棋盘,cas存放摆法.i j 是表示i行j列: 写一个用于递归的函数,思路如下 3.从上往下一行行的放皇后,放下一行时从最左边(第0列)放起,如果不能放就往右挪一格再试.注意判断右边有没有越界出棋

八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数 #include <iostream> using namespace std ; #define N 8 static int sum = 0 ; const int max = N ; void print (int board []) { for(int i = 0 ;i < max ;i++) { c

八皇后和全排列

经典的递归程序设计中的2到题目 1.八皇后问题 国际象棋棋盘走法,用递归实现所有的可能性: 棋盘: (1).代码如下: #include<stdio.h> typedef unsigned char boolean; #define TRUE        1 #define FALSE        0 #define EIGHT    8 void showChess(int (*chess)[EIGHT]);  //显示棋盘 boolean isSafe(int (*chess)[EIG

算法入门经典-第七章 例题7-2 八皇后问题

原本利用回溯思想解决的经典八皇后问题,其实也是可以用递归解决的~ 八皇后的递归解决思路: 从第一行开始,依次判断0~8列的哪一列可以放置Queen,这样就确定了该行的Queen的位置,然后行数递增,继而递归实现下一行的判断,依次类推直到行数增加到8(行数从0开始的),此时为递归-----归的条件,即表示一种八皇后的解决方法完成,打印结果:之后进行下一种解决方法的寻找,大致思路个人理解是这样 noDanger(row,j,(*chess)[8])函数是判断第row行第j列是否可以放置Queen #

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

八皇后问题,递归法实现

八皇后问题,是19世纪著名的数学家高斯在1850年提出的:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列.同一斜线上,试问有多少种摆法?高斯先生给出的答案是“76”种,实际是76种吗? 八皇后问题是回溯算法的典型应用,但是本文提供递归的求法. 递归的核心思想可以总结成:把一个复杂的问题无限缩小,每个小问题的解法都是一样的,最终归结于求解每个小问题的原型.递归编程的思路可以假设所有的问题都已解决,来到结束条件,这是非常简单的,然后再调用自身求解整个问

20150410 递归实现八皇后问题

20150410 递归实现八皇后问题 2015-04-10 Lover雪儿 十九世纪著名的数学家高斯1850年提出: 在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意的连个皇后都不能处于同一行.同一列或者统一斜线,问有多少种摆法. 以下是其中一种解法,如图所示: 当年高斯先生没日没夜的计算,得出结论是76种. 其实正确的结论是92中,此处我们就来编程计算一下正确的答案. 1 //八皇后问题 2 #include <stdio.h> 3 4 static int count = 0;