八皇后问题-使用递归回溯方法用c语言实现

C语言:八皇后问题----回溯算法 【问题引入】 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。 【问题分析】 本题将要用到的是一种回溯的思想,为了更方便解释,先来看一道四皇后问题,也就是在4X4的棋盘上放四个. 阅读详情

学习的视频:懒猫老师

https://www.bilibili.com/video/BV1wJ411U7Gy/?spm_id_from=333.337.search-card.all.click&vd_source=da60f9e1bc3321cae28c29fe80e9b078






 

代码:

编译:gcc test.c -g

#include <stdio.h>
#include<stdbool.h>

//全局变量数据初始化
int place[8] = {0};         //第n个皇后所占位置的列号
bool flag[8] = {1,1,1,1,1,1,1,1};	//标志数组,表示第coL列是否可占,1表示不冲突
bool d1[15] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};		//表示上对角线是否可占
bool d2[15] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};		//表示下对角线是否可占
int number = 0;		//用于统计解的数量(八皇后总共有92个解)

void print();
void gernerate(int n);

int main()
{
    gernerate(0);
    return 0;
}

//打印结果,第n个皇后所占位置的列号
void print()//定义输出函数
{
	int col,i,j;
	number++;//每调用一次输出函数number自加一次,记录摆放方法个数
	printf("No.%2d\n",number);
	int table[8][8]={0};//设置一个8*8的棋盘
	for (i=0;i<8;i++)
	{
		table[i][place[i]]=1;//将每一行皇后所在位置赋值为1
	}
	for (i=0;i<8;i++)
	{
		for (j=0;j<8;j++)
		{
			printf("%d ",table[i][j]);
		}
		printf("\n");
	}
}

void gernerate(int n)
{
    int col;
    for(col = 0;col < 8;col++)//每个皇后都有8种可能的列
    {
        if(flag[col]&&d1[n-col+7]&&d2[n+col])//判断位置是否冲突
        {
			place[n] = col;			//在n行coL列摆放皇后
			flag[col] = false;		//宣布占领第coL列
			d1[n-col+7] = false;	//占领两个对角线
			d2[n+col] = false;

			if(n < 7)				//8个皇后没有摆完,递归摆放下一行里面的皇后
				gernerate(n+1);
			else
				print();			//N=7,皇后都放完了,打印结果
			
			//回溯:考虑其它的可行方案
			flag[col] = true;
			d1[n-col+7] = true;
			d2[n+col] = true;
        }
    }
}

运行结果:

C语言 八皇后问题 用递归回溯思想 八皇后问题: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 1、 ... 阅读详情

相关推荐

八皇后问题(回溯算法C语言实现)

八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 8*8 的棋盘中放置八个皇后,使得任意两个皇后都不在同一条横线、纵线或者斜线上。大家可以自己运行一下程序,查看运行结果,由于八皇后问题有 92 种摆法,这里不一一列举。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往。八皇后问题是使用回溯算法解决的典型案例。图 2 八皇后问题示例(#代表皇后))获取教程的完整 PDF 电子版。页面系统的学习,加我 q(

数据结构和算法教程(C语言版) 774

八皇后问题4种c语言算法

八皇后问题 1.递归回溯法 B站懒猫老师讲的(我在这里学的) 八皇后问题的递归回溯算法思路:从第一行开始当某一行皇后位置不与前面所有皇后位置冲突那么记录该行皇后位置并调用递归函数进入下一行,摆放下一个皇后,逐个位置摆放,若该行所有位置都被其他皇后占领,那么就回溯到上一行重新摆放上一行皇后直至所有皇后都不冲突那么记录一次方法然后回溯寻找其他摆放方法。 冲突算法思路:一个8*8的棋盘每一个位置若用其行号加上其列号我们可以得到下图,由图可知在同一条上对角线的数值都相同,因此我们可以利用该规律设计判断上对角线是否冲

yunProgrammer的博客 1万+

经典算法八皇后问题的详解以及回溯(递归)代码示例

对经典算法八皇后问题的说明,以及代码示例,代码中有详尽的注释,有助于读者充分理解其递归调用的逻辑!

八皇后问题,秒懂递归回溯(有图详解|c语言)

前言: 各位和我一样的刚学完递归的小白们,是不是突然遇见了一个大BOSS,八皇后问题!!把自信的说着“老子递归学好了!”的你一棒子打回了出生点,就像你刚玩只狼遇到的那个大胖子,刚玩原神遇到的雪山。今天,我就和大家一起学习一下这个著名的八皇后问题。

c0re的博客 2万+

递归方法解决八皇后问题(C语言版)

递归解决八皇后问题 使用的是VS2010(编译通过) 代码有注释说明

C语言使用递归来实现N皇后问题的算法设计

一个自己编写的N皇后算法,程序较简单,用递归实现。

C语言八皇后问题----递归精讲

C语言八皇后问题 棋盘是8*8的,所以定义一个8的宏,方便后面的使用,如果以后更改棋盘大小,也只需要更改宏定义就好了,很方便。代码如下: #define WIDTH 8 定义一个8*8(棋盘大小为8),值全为0的二维数组,,后面每放一个皇后,其二维数组上的值对应改变为1(0表示无皇后,1表示有皇后)。代码如下: chessBoard[WIDTH][WIDTH] = {0}; 放置皇后的原则...

adaizzz的博客 1909

用回溯法解决八皇后问题C语言实现

有多种方法解决八皇后问题,在这里我用的是回溯法解决八皇后问题。大家一起来学习呀!!

C语言之回溯算法

回溯算法的基本思想 回溯算法的基本思想是通过递归的方式搜索解空间树。通过使用递归和合适的剪枝技巧,我们可以避免不必要的计算,提高算法的效率。在本文中,我们使用C语言实现了回溯算法,并以八皇后问题为例进行了演示。在一个8×8的棋盘上,摆放8个皇后,要求任意两个皇后都不能在同一行、同一列或同一对角线上。回溯算法概述 回溯算法通常用于解决组合优化问题,如排列、组合、子集和图的搜索等。它遵循“试错”的策略,在搜索过程中根据当前局部解的状态做出决策,并根据结果调整或取消之前的选择。

weixin_72909426的博客 966

C语言基于回溯算法解决八皇后问题的方法

主要介绍了C语言基于回溯算法解决八皇后问题的方法,简单描述了八皇后问题,并结合实例形式分析了C语言使用回溯算法解决八皇后问题的相关操作技巧,需要的朋友可以参考下

解决MATLAB2020B关于找不到vs2019C++编译器问题

解决MATLAB2020B关于找不到vs2019C++编译器问题

wcm2577的博客 7606

递归解决八皇后问题(C语言实现)

#include <stdio.h> #include <windows.h> #include <math.h> #pragma warning(disable:4996) #define N 8 int col[N] = { 0 };//存放每一行皇后的列标 int num = 0;//一共有几种方法 void print() { int i = ...

gangber的博客 1321

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

八皇后问题自我总结

八皇后 Description 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 Input No Output 输出所有八皇后问题的解 注解:在国际象棋中,皇后可以吃掉在同一行、列、斜线的其他的棋子。         八皇后是一个经典的题目(作为一个菜鸟这是我碰到的比较难的一个题,所以自我总结一下,大佬请直接跳过)      

mutinner的博客 2658

Python声音识别实战:从音频处理到智能分类

本文详细介绍了使用Python进行声音识别的完整实战流程。从音频预处理、特征提取(如MFCC)到构建分类模型(SVM、CNN),并最终实现一个实时环境音分类器。文章以Python为核心工具,结合librosa等库,为开发者提供了从理论到实践的清晰路径,适用于智能家居、工业监测等多种应用场景。

weixin_29064009的博客 324

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

使用C语言解决八皇后问题

八皇后问题是经典的回溯算法示例,要求在8×8的国际象棋棋盘上放置8个皇后,使其互不威胁。// 回溯,移除皇后。if (board[i][j] == 1) { // 检查左上对角线。if (board[i][j] == 1) { // 检查右上对角线。if (board[i][col] == 1) { // 检查同列。通过递归与回溯的方法,可以逐行尝试放置皇后,并在发现冲突时回退到上一步调整位置。// 初始化棋盘,所有位置为0。// 用于计数解的数量。

2302_80352045的博客 768

链接文件及功能安全:基于Tasking的LSL链接文件知识点梳理及实际应用分析

本文旨在记录研究链接文件时所遇到的问题及个人理解,以便日后查阅。在探索过程中,我遇到了诸多问题,同时对链接文件有了初步的认识。通过记录这些问题与理解,我希望能够为后续的研究提供清晰的思路和有价值的参考。这不仅是对研究过程的总结,更是对未来学习和实践的有力支持。

梦想技术家 1103

八皇后问题(回溯法)

八皇后问题百度百科 经典的回溯法题目 代码: #include"stdio.h" #define N 8 //最低值可以到4 int count; int cb[N][N]; //Checkerboard 棋盘 //检查行列对角线是否有放棋子 int check(int x, int y) { int i; for (i = 0; i < N; i++)//行列检查 if...

Roy在编程 547

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 407

paddle 43 用onnxruntime实现ppyoloe模型的部署(含python和c++版本)

PP-YOLOE+是PP-YOLOE模型的升级版,PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比。paddle官方只给出了基于paddle框架的部署案例,为了更好的部署,为此实现将paddle模型转换为onnx模型,然后在python下实现onnxruntime部署。后续会补充c++ onnxruntime部署

a486259的博客 1915

八皇后递归与非递归解法得到所有解-c语言

八皇后递归与非递归解法全解-c语言 核心思想:把二维数组的问题转化到三个一维数组上。 每次在(i,j)点放皇后,钟需要考虑四个方向,本行,本列,左斜线,右斜线。放的顺序从0行到7行依次放每行,所以轮到放第i行时不需考虑该行是否已放(一定没放).所以剩下三个方向,我们可以用三个一维数组表示该位置是否已经放了皇后。 //列数组,初始化为0,表示每列都没放,总共八列 int col[8]={0}; //右斜线数组,15列 int left[15]={0}; //左斜线数组,15列 int right[15]={0

GHCI-Li的博客 1116

File does not exist: /user/anonymous/.staging/job_1628851608378_6064/报错问题解决

user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist 所以为什么没有下发,这里面jhist,只是被引发的错误,它还不是根本的错误。看到上面错误,我们就可以判断,这是网络问题,然而网络无非是ip地址,防火墙,端口,hosts等。我们正常的hosts是这样的。在回头复盘想想,我们找不到jhist,跟我们的网络问题二者是很难找到关联的,所以大家在遇到问题的时候,一定多排查和思考,而不是看到一个错误,就以为是它的问题。

石榴姐yyds 2170

八皇后问题c语言循环,八皇后问题的12组解

该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#defineN8/*皇后数*/typedefintbool;rot(chard[],chars[]){inti;for(i=1;i<=N;i++)d[N-(s[i-1]-'0')]=i+'0';d[N]='';}zhuan(chard[],chars[]){inti;for...

weixin_39793420的博客 229

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

八皇后问题一种求解思路

 //这个程序是用来求八皇后问题的所有解//基本思路是当(i,j)位置被皇后占了的时候,i行,j列,和i+j,i-j相等的斜行也不能够被其他皇后占有#include"stdio.h"#include"stdlib.h"#define SIZE  8#define TOTALNUM 100 int row[ SIZE ] ;//记录行的数组int col[ SIZE ] ;//记录列的数组i

tjltail的专栏 2150

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

八皇后java非递归_八皇后的递归与非递归解

1、递归。递归真是个好东西,解法一目了然。#include#define N 8int l[14];int r[14];int q[N];int col[N];static int cnt = 0;void try(int i){int j;for(j=0; j{if(l[i+j] == 0 && r[i-j+7] ==0 && col[j] == 0){l[i+j...

weixin_32466193的博客 268

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 动态单向链表的增删改查
下一篇: tcpdump源码分析
沉不默
博客等级 码龄7年 84粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值