(C++)八皇后问题

文章目录

  • 一、实验目的、内容
  • 二、实验程序设计及结构
    • 1.需求分析
      • 变量
      • 函数
    • 2.设计结构或流程图
      • 递归
      • 非递归
  • 三、设计过程
  • 四、测试分析
    • 递归
    • 非递归
  • 五、设计的特点和结果

一、实验目的、内容

在8行8列的棋盘上放置8个皇后,使任一个皇后都不能吃掉其他的7个皇后,并将结果以某种方式显示出来。

二、实验程序设计及结构

1.需求分析

采用回溯算法。

变量

数组linenum(unsigned char[8])表示特定列的皇后要放的行位置,a(unsigned char)的第i位表示第i行上已经有皇后,b(unsigned short)的第i位表示第i条主对角线上已经有皇后,c(unsigned short)的第i位表示第i条副对角线上已经有皇后;c(char)表示用户的选择。

函数

递归函数void solve(unsigned char r, bool& f),递归算法void f1(),非递归算法void f2(),主函数int main()

2.设计结构或流程图

递归

  1. 根据r判断要处理的linenum位置并用p标记。
  2. p从1到8寻找可放置的位置。
  3. 若放置成功则++r并寻找下一位;否则返回寻找上一个皇后的下一个可行位置。
  4. 不断递归直至r等于8并输出。

非递归

与递归类似,将形参r改为循环变量,将标记p改为指针用于操作数组。

三、设计过程

#include <iostream>
using namespace std;
unsigned char linenum[8], a;
// 若用bool数组会造成内存空间浪费,采用无符号整型及位运算来节省空间
unsigned short b, c;
void solve(unsigned char r, bool &f)
{unsigned char &p = linenum[r - 1];p = 1;while (a >> p - 1 & 1 || b >> r + p - 2 & 1 || c >> r - p + 7 & 1) // 循环条件为是否不可放置F:if (++p > 8){f = false;return;}a += 1 << p - 1;b += 1u << r + p - 2;c += 1u << r - p + 7;f = true;if (r < 8)solve(r + 1, f); // 如果当前方案不可行,回溯到上一步// 递归后仍然没有放置皇后,进入循环寻找下一个位置if (!f){a -= 1 << p - 1;b -= 1u << r + p - 2;c -= 1u << r - p + 7;goto F;}
}
// 递归
void f1()
{// 若用-1(各位数全是1)初始化,就需要在solve函数中用非运算,效率较低a = b = c = 0;bool f;solve(1, f);for (signed char i = 0; i < 8; ++i){for (signed char j = 0; j < 8; ++j)if (linenum[j] == i + 1) // 该位置有皇后cout << "Q ";elsecout << "+ ";cout << endl;}
}
// 非递归,过程类似于递归
void f2()
{a = b = c = 0;unsigned char *p = linenum - 1, r = 1;do // 把递归改为一重循环{*++p = 1;while (a >> *p - 1 & 1 || b >> r + *p - 2 & 1 || c >> r - *p + 7 & 1)while (++*p > 8){a -= 1 << *--p - 1;b -= 1u << --r + *p - 2;c -= 1u << r - *p + 7;}a += 1 << *p - 1;b += 1u << r + *p - 2;c += 1u << r - *p + 7;} while (++r < 9);for (signed char i = 0; i < 8; ++i){for (r = 0; r < 8; ++r)if (linenum[r] == i + 1)cout << "Q ";elsecout << "+ ";cout << endl;}
}
int main()
{char c;
F:cout << "请选择计算方式:\nA.递归\tB.非递归\n";cin >> c;switch (c){case 'A':f1();break;case 'B':f2();break;default:cout << "输入错误!\n请重新输入!\n";goto F;}system("pause");return 0;
}

四、测试分析

递归

非递归

五、设计的特点和结果

采用了回溯算法,较穷举法大大提高了效率。由于递归效率较低,故又写了非递归的程序。

结果:输出了八皇后问题的第一种情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/424315.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

颠覆传统制造:PLC物联网如何彻底改变工厂设备数据采集的游戏规则?

颠覆传统制造&#xff1a;PLC物联网如何彻底改变工厂设备数据采集的游戏规则&#xff1f; 随着科技的不断发展&#xff0c;物联网技术正逐渐渗透到各个领域&#xff0c;其中PLC物联网技术在工厂设备数据采集方面发挥着越来越重要的作用。PLC物联网技术通过将PLC&#xff08;可编…

网络安全概述---笔记总结

网络安全概述 网络安全---Cyberspace security 2003年美国提出网络空间的概念 --- 一个由信息基础设施组成的互相依赖的网络。我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 发展阶段&#xff1a; 通信保…

【漏洞复现】SpringBlade export-user接口SQL注入漏洞

文章目录 前言声明一、SpringBlade系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建&#xff0c;完全遵循阿里巴巴编码规范。提供基于React和…

msvcp140_1.dll丢失需要怎样修复

一、msvcp140_1.dll属性介绍 msvcp140_1.dll 是一个动态链接库 (DLL) 文件&#xff0c;它是 Microsoft Visual C 2015 Redistributable 的一部分。这个库包含了一些 C 标准库的函数和类&#xff0c;用于支持应用程序的开发和运行。以下是 msvcp140_1.dll 文件的一些属性介绍&a…

JavaEE:多线程(2):线程状态,线程安全

目录 线程状态 线程安全 线程不安全 加锁 互斥性 可重入 死锁 死锁的解决方法 Java标准库中线程安全类 内存可见性引起的线程安全问题 等待和通知机制 线程饿死 wait notify 线程状态 就绪&#xff1a;线程随时可以去CPU上执行&#xff0c;也包含在CPU上执行的…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…

理解PCIE设备透传

PCIE设备透传解决的是使虚拟机直接访问PCIE设备的技术&#xff0c;通常情况下&#xff0c;为了使虚拟机能够访问Hypervisor上的资源&#xff0c;QEMU&#xff0c;KVMTOOL等虚拟机工具提供了"trap and emulate"&#xff0c; Virtio半虚拟化等机制实现。但是这些实现都…

【JavaEE Spring】MyBatis 操作数据库 - 进阶

MyBatis 操作数据库 - 进阶 1. 动态SQL1.1 \<if>标签1.2 \<trim>标签1.3 \<where>标签1.4 \<set>标签1.5 \<foreach>标签1.6 \<include>标签 1. 动态SQL 动态 SQL 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接…

卡尔曼滤波器原理By_DR_CAN 学习笔记

DR_CAN卡尔曼滤波器 Kalman Filter Recursive Algorithm迭代过程 数学基础正态分布和6-SigmaData FusionCovariance MatrixState Space Representation离散化推导 linearizationTaylor Series2-DSummary Step by Step Derivation of Kalman Gain矩阵求导公式 Prior / Posterio…

C语言爬虫采集图书网站百万数据

最近需要查阅一些资料&#xff0c;只给到相关项目名称以及关键词&#xff0c;想通过图书文库找到对应书籍&#xff0c;那么怎么才能在百万数据库中找到自己需要的文献呢&#xff1f; 今天我依然用C语言写个爬虫程序&#xff0c;从百万数据库中查找到适合的文章&#xff0c;能节…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写&#xff0c;1986年&#xff0c;由德国Bosch公司为汽车开发的网络技术&#xff0c;主要用于汽车的监测与控制&#xff0c;目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

10分钟入手一套监控系统

写在前面的话 在这里&#xff0c;我将分享一些观测云的小技巧&#xff0c;让您能更好地注册、接入和利用免费额度。 pv每天是2000的免费额度&#xff0c;这里有个技巧&#xff0c;就是支持配置采样率&#xff0c;以1%的采样率来计算&#xff0c;每天也有20万的额度了就是采样设…