QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2283|回复: 0
打印 上一主题 下一主题

排列树的回溯搜索解决n皇后问题

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。  Q- G8 U5 [9 Z: {+ d
让我们逐步解释这段代码:
% Y$ @' G, b# L# T0 wfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)$ N! o8 Q$ W8 h1 s. f! d! a$ |
9 p0 }4 }) i% u4 ^/ z
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。9 W+ @" n/ D, `% S! N( V, ^$ u
if i == 9
$ n! A) D! s" X6 m    number = number + 1;
2 N* ?/ t# ^! u+ I+ {7 O    chess1 e7 T+ ~9 g1 p* c( `
else
8 E7 j" Q1 ]! z    for k = i:8; T; I) S6 U! U" ?9 I% x
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0. H5 R* E4 X& ~* T% q- T# b( M
9 B- f; }/ c* l/ J$ ^2 [& B  _
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。
+ \) V) S2 u: [# N5 H/ }- o9 ~* z嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。6 N* n+ b6 x' j
            t = chess(k); % 交换位置
; E/ I6 m! K* t9 a) p            chess(k) = chess(i);/ r* l! }3 Y# f- L
            chess(i) = t;. ]: i0 G0 c% K6 N7 g8 B0 z1 ^6 h
! E& \6 w) j' Y
            main(i - chess(k) + n) = 1;9 r4 W! I1 K) {! y  V
            deputy(i + chess(k) - 1) = 1;
  {9 w( n% w: {! ^, T
8 r# |; P* ~$ X6 y            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
6 y6 z2 P0 y1 P5 E
4 S( L* O0 `$ j  c            t = chess(k); % 回溯
: \3 B; J$ l9 G  b7 ]/ h            chess(k) = chess(i);# Y6 A1 ~+ C: Z2 S
            chess(i) = t;  {4 N+ T# W# g- _& w+ P

5 c- O" }3 A- U$ r            main(i - chess(k) + n) = 0;
9 E1 ]$ }# I6 Z6 ?$ u( I. {            deputy(i + chess(k) - 1) = 0;
2 F  B* B" f" |- P( A7 s  m
/ w, H3 `/ W, j0 J这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。7 v' d( f' M: K4 A$ O) ]9 ?
        end
" M* {. H7 d/ R    end
5 b" M$ ]7 Q7 P) l0 vend' W4 G1 `4 X/ ?/ h% U

/ Y; e6 y. K5 v这结束了循环和函数。如果i不是9,循环将继续到下一行。- y' h; d0 L+ u( c, h' F0 I! i
clear all
5 L. K! R  [9 U* }5 O# E$ Q* Pclc
! d9 s8 j" n3 C  i& P: E# F$ L9 Z4 J. O; k6 B
这些命令清除工作区和命令窗口。
; l% D; X+ R" Qn = 8;
$ w1 j6 @, F6 ochess = zeros(1, n);9 U! e! S4 {$ e9 m! m8 B
for i = 1:n
0 P% {) p' t; ~, X    chess(i) = i;
  a" P2 j$ M- @1 `* f4 e; eend& c# e) Q8 L, k* Q

+ B% z+ M& z/ V& g$ v这初始化了一个带有皇后的第一行的棋盘。
4 a) U, w4 E8 ~; d9 q+ W6 Fmain = zeros(1, 2 * n - 1); % 记录主对角线的使用情况
) v9 v* Y8 _5 n/ ]# p& Qdeputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
' h" a0 ^" A# v' F2 [' T" X/ }number = 0;9 J, ^& E! J" R3 R! f
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);/ M. O# O% Z+ c  s5 g4 L. R
: L3 I& l$ ], u/ T3 o( d; e
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。& ?9 ?( U1 R; a! ^
! s. i. Z' w/ y, n* Z0 q) Y6 v
. J7 o; d% A, U
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-12 19:28 , Processed in 0.429589 second(s), 51 queries .

回顶部