回溯法解八皇后问题及再看八皇后问题优化

2024-03-27 10:32

本文主要是介绍回溯法解八皇后问题及再看八皇后问题优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、介绍

先上张图来说明用回溯法解八皇后问题的每一步:

        


2、程序

看着严蔚敏的书写的,写好后运行一次性成功了,程序如下:

//  N皇后问题  #include <iostream>  
using namespace std;  #define N 8  bool matrix[N + 1][N + 1] = {0};  bool IsLegal(bool matrix[N + 1][N + 1], const int &i, const int &j)  
{  //  判断前面的i-1个棋子与matrix[i][j]是否冲突,i为1时合法  for (int m = 1; m <= i - 1; ++m) {  for (int n = 1; n <= N; ++n) {   //  实际每一行只有一个棋子  if (matrix[m][n] == 1) {  if ( n == j || abs(i - m) == abs(j - n) )   //  key, not bad  return false;  }  }  }  return true;  
}  void Print(bool matrix[N + 1][N + 1])  
{  static int count = 1;  printf("Case %d:\n", count++);  for (int i = 1; i <= N; i++) {  for (int j = 1; j <= N; j++) {  matrix[i][j] == 1 ? printf("%c ", 2) : printf(". ");  }  cout << endl;  }  cout << endl;  
}  void Trial(const int i)  
{  //  进入本函数时,在N*N的棋盘前i-1行已放置了互不攻击的i-1个棋子  //  现从第i行起继续为后续棋子选择合适位置  if (i > N)   //  输出当前的合法布局  Print(matrix);  else  for (int j = 1; j <= N; ++j) {  matrix[i][j] = 1;  if ( IsLegal(matrix, i, j) )  Trial(i + 1);  matrix[i][j] = 0;  }  
}  int main(void)  
{  Trial(1);  return 0;  
}  
运行结果:



3、数学问题

关于n皇后的解的个数(8皇后是92个解):

[cpp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. n       a(n)  
  2. 1       1  
  3. 2       0  
  4. 3       0  
  5. 4       2  
  6. 5       10  
  7. 6       4  
  8. 7       40  
  9. 8       92  
  10. 9       352  
  11. 10      724  
  12. 11      2680  
  13. 12      14200  
  14. 13      73712  
  15. 14      365596  
  16. 15      2279184  
  17. 16      14772512  
  18. 17      95815104  
  19. 18      666090624  
  20. 19      4968057848  
  21. 20      39029188884  
  22. 21      314666222712  
  23. 22      2691008701644  
  24. 23      24233937684440  
  25. 24      227514171973736  
  26. 25      2207893435808352  
  27. 26      22317699616364044  

这篇关于回溯法解八皇后问题及再看八皇后问题优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851809

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec