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

八皇后问题:

在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线

为它所在的列和行,还有45度斜线.

对于该问题,首先要确定递归的输入和输出,以及终止条件和方法。一个递归完成对当

前行皇后位置的确定,并通过遍历所有列,查找出所有可能。其中,利用对列的遍历实

现回溯。

具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122

参考博客的博主对于八皇后位置的表示处理的很好,非常有借鉴意义

//==========[数据结构]:八皇后===========

//[递归],[回溯]

include

include

include

define n 8 //确定八皇后的阶数

int queen[n]; //每行对应的皇后位置 queen[行数row] = 列数col

int num = 0; //计算可能出现的正确方式次数

//判断当前行,皇后位置是否合理

bool isqueen(int row)

{

for(int i=0;i<row;i++)//依次将当前行皇后位置与已放行皇后位置进行比较

{

if(abs(row-i) == abs(queen[row]-queen[i]) || queen[row] == queen[i])

//此处用意:确定当前行皇后位置是否与已放行皇后位置存在冲突(对角线 || 同一列)

{

return false;

}

}

return true;

}

//求解函数

void eightqueen(int row)

{

for(int col=0;col<n;col++) //依次摆放的列,遍历,回溯

{

queen[row] = col; //

if(isqueen(row)) //

{

if(row == n-1) //最后一列,递归终止条件

{

num++; //可能情况

printf("第%d种:",num);

for(int i=0;i<n;i++) printf("(%d,%d) ",i,queen[i]);

printf("\n");

}

else eightqueen(row + 1); //下一行

}

}

}

int main()

{

printf("====welcome to eightqueen‘s question====\n表示方法:(行数,当前行皇后所在列数)\n");

eightqueen(0);//调用求解函数,负责打印结果

}

原文地址:https://www.cnblogs.com/ZhongShengXueXi/p/9129501.html

时间: 2024-10-09 06:10:51

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

回溯算法--八皇后问题

问题描述:八皇后不能相互攻击,即,八个皇后不能同行,同列,不同在同一条对角线上, 对角线又可以分为左对角线和右对角线 左对角线上满足:i-j+7都相等(i,j分别是一维和二维的坐标) 右对角线满足:i+j 都相等 代码如下: #include <iostream> using namespace std; int e_q[8][8]; int r[15]; int le[15]; int q[8]; int count = 0; void en_queens(int); int main()

Ka的回溯编程练习 Part2|八皇后问题

1 #include <stdio.h> 2 int AChessBlockRecorder[10]={0}/*下标层数,内容竖行*/,ThisIsMyPlace[10]={0};/*占领*/ 3 int TheTalentOfTheQueen1[25]={0}; //前一个维度代表主对角线特性,相减同 4 int TheTalentOfTheQueen2[25]={0}; 5 int total=0; 6 void output() 7 { 8 total++; 9 printf("

八皇后,回溯与递归(Python实现)

八皇后,回溯与递归(Python实现) 八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语言的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩展为九皇后,十皇后问题. 问题:在一个8*8棋盘上,每一行放置一个皇后旗子,且它们不冲突.冲突定义:同一列不能有两个皇后,每一个对角线也不能有两个皇后.当然,三个皇后也是不行的,四个也是不行的,凭你的智商应该可以理解吧. 解决方案:回溯与递归. 介绍: 1.回溯法 回溯

使用java语言实现八皇后问题

八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 public static Integer[][] checkerBoard = new Integer[8][8]; // 棋盘副本 public stati

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

回溯法解决八皇后问题

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

用递归和回溯法实现八皇后问题

问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋棋盘上放置八个皇后,使得任意两个皇后不能互相攻击,即任何行.列或对角线(与水平轴夹角为45°或135°的斜线)上不得有两个或两个以上的皇后.对于这个问题数学家高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种计算机语言可以解决此问题. 问题分析 在这里我们可以声明一个

N皇后问题(递归回溯)

今天讲了N后问题,现在来复习一下. N后问题就是在N*N格的棋盘上面放置彼此不受攻击的n个皇后.这里的皇后指的是国际象棋中的皇后,按照国际象棋的规则,皇后可以攻击当前行和当前列还有同一斜线的棋子.简单来说,就是n个皇后的位置不可以在同一行,同一列,同一斜线.因为这几天学习的是回溯算法,很简单的想到了回溯.这个问题也是经典的回溯算法习题之一. 下面来想一下问题所包含的条件,明显的条件就是棋盘是n*n,而且很简单就想到n个皇后不可以在同一列,就是每一列都会有一个皇后.下面就是隐式的条件了,同一行和同

LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会详细解读深度优先搜索和回溯算法,感兴趣的同学不容错过. 链接 Next Permutation 难度 Medium 描述 实现C++当中经典的库函数next permutation,即下一个排列.如果把数组当中的元素看成字典序的话,那下一个排列即是字典序比当前增加1的排列.如果已经是字典序最大的情况