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

八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击。共有几种摆法?

基础知识:

国际象棋里,棋盘为8X8格。

皇后每步可以沿直线、斜线 走任意格。

思路:

1.想把8个皇后放进去,肯定最终每行只有一个皇后,每列只有一个皇后。

2.设个二维数组chess [ i ] [ j ] 模拟棋盘,cas存放摆法。i j 是表示i行j列:

写一个用于递归的函数,思路如下

3.从上往下一行行的放皇后,放下一行时从最左边(第0列)放起,如果不能放就往右挪一格再试。注意判断右边有没有越界出棋盘。

4.写一个函数专门判断当前位置能不能放,只需要判断该位置的横、竖、两对角线,这四条线上有没有其他皇后即可。

5.如果把最后一行放完了,那就统计上这个摆法,cas++。摆完最后一行不能继续判断下一行了。

6.放完一种情况,还要探究其他情况,可以把现在放好的皇后“拿走”,然后再试探 之前没试探过的棋盘格。

下面是递归函数部分:

void queen(int i,int j){  
    if(j>=line){  //如果右侧越界
    return ;
    }

    if(check(i,j)==1){//如果能放
    chess[i][j]=1;//放皇后
        if(i==line-1){//如果是最后一行,记录情况
        cas++;
        }
        else{
        queen(i+1,0);//不是最后一行就分析下一行
        }
    }

    chess[i][j]=0;//如果此位置不能放,就置空(0),判断旁边的格子。
    //如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
    queen(i,j+1);

}

(未完待续,明天再写)

#include<stdio.h>
#define line 8
void queen(int i,int j);
int check(int i,int j);

int queennumber=8;
int chess[line][line];
int cas=0;

int main(){
queen(0,0);
printf("%d\n",cas);
return 0;
}

void queen(int i,int j){
    if(j>=line){
    return ;
    }

    if(check(i,j)==1){//如果能放
    chess[i][j]=1;//放皇后
        if(i==line-1){//如果是最后一行,记录情况
        cas++;
        }
        else{
        queen(i+1,0);//不是最后一行就分析下一行
        }
    }

    chess[i][j]=0;//如果此位置不能放,就置空(0),判断旁边的格子。
    //如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
    queen(i,j+1);

}

int check(int i,int j){
int k;

    for(k=0;k<line;k++){
    if(chess[i][k]==1) return 0;//0=不能放
    }
    for(k=0;k<line;k++){
    if(chess[k][j]==1) return 0;
    }
    for(k=-line;k<=line;k++){//两对角线
    if(i+k>=0&&i+k<line&&j+k>=0&&j+k<line)//二四象限对角线
        if(chess[i+k][j+k]==1) return 0;

    if(i-k>=0&&i-k<line&&j+k>=0&&j+k<line)//一三象限对角线
        if(chess[i-k][j+k]==1) return 0;
    }
    return 1;
}

原文地址:https://www.cnblogs.com/cnnnnnn/p/8506883.html

时间: 2024-10-25 11:25:20

八皇后问题 递归实现 C语言 超详细 思路 基础的相关文章

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

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于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+

八皇后回溯递归 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

js 手动实现bind方法,超详细思路分析!

壹 ? 引 在 js 实现call和apply方法 一文中,我们详细分析并模拟实现了call/apply方法,由于篇幅问题,关于bind方法实现只能另起一篇. 在模拟bind之前,我们先了解bind的概念,这里引入MDN解释: bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用. 说的通俗一点,bind与apply/call一样都能改变函数this指向,但bind并不会立即执行函

八皇后和全排列

经典的递归程序设计中的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 #

八皇后的问题

八皇后的问题和马踏棋盘的思路是一样,都用到了回溯的思想.代码也都差不多.这个里面最精彩的地方用4个一位数组表示了这个棋盘.这个里面总共有92组解 代码展示 #include<stdio.h> #include<stdlib.h> int col[8]={0}; int right[15]={0}; int left[15]={0}; int Queen[8]; int cnt; //全局变量 void print(); void insertQueen(int ); void in

通过C语言,利用递归回溯的方法,实现八皇后问题的求解

八皇后问题: 在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线 为它所在的列和行,还有45度斜线. 对于该问题,首先要确定递归的输入和输出,以及终止条件和方法.一个递归完成对当 前行皇后位置的确定,并通过遍历所有列,查找出所有可能.其中,利用对列的遍历实 现回溯. 具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122 参考博客的博主对于八皇后位置的表示处理的很好,