当前位置: 首页 > article >正文

八N皇后问题

1 问题的提出

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
 


我们的任务就是用MATLAB进行求解

2 数学模型的构建

首先我们分析题目就是
任意两个皇后都不能处于同一行、同一列或同一斜线上

global board sum;
board = zeros(8,8);
sum = 0;
dfs(1);
disp(sum);function dfs(x)global board sum;if x > 8sum = sum + 1;return;endfor i = 1:8if issafe(x,i,board)board(x,i) = 1;dfs(x+1);board(x,i) = 0;endend
endfunction safe = issafe(row, col, board)safe = true;% 检查列for i = 1:row-1if board(i, col) == 1safe = false;return;endend% 检查右上角i = row - 1;j = col + 1;while i >= 1 && j <= 8if board(i, j) == 1safe = false;return;endi = i - 1;j = j + 1;end% 检查左上角i = row - 1;j = col - 1;while i >= 1 && j >= 1if board(i, j) == 1safe = false;return;endi = i - 1;j = j - 1;end
end

我们要学习这里面的思想

3 模块1 dfs搜索函数

function dfs(x)global board sum;if x > 8sum = sum + 1;return;endfor i = 1:8if issafe(x,i,board)board(x,i) = 1;dfs(x+1);board(x,i) = 0;endend
end

我们有8个皇后,那就是for循环循环8行,每次放置一个棋子就进行一次判断,然后判断这个棋子可不可以落在这里如过可以那么久进入到下一行,x进行+1秒如果不可以的话,那么就进入这一行的下一个格子下一个,这就是枚举8行8列
当这个x > 8的话,那么就是放置成功了

4 检查模块

function safe = issafe(row, col, board)safe = true;% 检查列for i = 1:row-1if board(i, col) == 1safe = false;return;endend% 检查右上角i = row - 1;j = col + 1;while i >= 1 && j <= 8if board(i, j) == 1safe = false;return;endi = i - 1;j = j + 1;end% 检查左上角i = row - 1;j = col - 1;while i >= 1 && j >= 1if board(i, j) == 1safe = false;return;endi = i - 1;j = j - 1;end
end

首先我们的行是已经操作完的了,就是在判断行的话是在递归的过程中进行讨论的,然后就是只需要判断这个列是否成立就好了,然后斜边的话,那不就是直接判断左上角和右上角就好了
左上角和右上角的检查

    % 检查右上角i = row - 1;j = col + 1;while i >= 1 && j <= 8if board(i, j) == 1safe = false;return;endi = i - 1;j = j + 1;end

我们知道右上角就是不断的进行加1嘛,这个行的话,列就是不断地进行减1,左上角就是反着地

http://www.lryc.cn/news/2398888.html

相关文章:

  • TMS320F28388D使用sysconfig配置IPC
  • 代码训练LeetCode(19)轮转数组
  • 每日算法 -【Swift 算法】将整数转换为罗马数字
  • Qwen与Llama分词器核心差异解析
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 与 Cline 快速构建AI编程助手
  • pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)
  • Android App引用vendor编写的jni动态库
  • React从基础入门到高级实战:React 核心技术 - 错误处理与错误边界:构建稳定的应用
  • 页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式
  • 碰一碰发视频-源码系统开发技术分享
  • C++学习过程分享
  • C语言 — 动态内存管理
  • 《TCP/IP 详解 卷1:协议》第5章:Internet协议
  • C#面向对象实践项目--贪吃蛇
  • 学习STC51单片机26(芯片为STC89C52RCRC)
  • Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
  • Nginx详解(三):ngx_http_rewrite_module模块核心指令详解
  • C++ 建造者模式:简单易懂的设计模式解析
  • 【笔记】在 MSYS2(MINGW64)中正确安装 Poetry 的指南
  • IDEA项目推送到远程仓库
  • DeepSeek 赋能 NFT:数字艺术创作与交易的革新密码
  • 【后端架构师的发展路线】
  • matlab/simulink TLC语法基础练习实例
  • MAU算法流程理解
  • 蓝桥杯国赛训练 day1
  • ESP32之Linux编译环境搭建流程
  • Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)
  • QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配
  • UE5打包项目设置Project Settings(打包widows exe安装包)
  • Python中os模块详解