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

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

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx