QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2866

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。; W( y( M; d2 k
让我们逐步解释这段代码:
6 E3 ?1 }# ]1 k8 B& G& u' F8 Xfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)' V3 i- b, N1 j! v6 s/ N

; y( ]" P$ s4 |  k* R这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
/ X) V- d3 M  u" m/ ~; i( Rif i == 9
( y3 m4 N# r- ]5 H% Q8 A# L# x/ d    number = number + 1;/ B+ i( {3 R" @$ {5 E) z5 L9 `
    chess" o% v6 i; `. Z
else. B) Z3 @. g& B  X+ W1 O. P
    for k = i:8) D2 v: g8 k$ X8 _
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0/ b! z. i$ Y, \8 W

' ^1 c7 g  ?& s) U这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。& ?2 v& e) f* R" R, Q9 m
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
! i* b2 D% j) O0 |5 |# I$ u            t = chess(k); % 交换位置
/ x( d# P. x& q) X" _7 K- J            chess(k) = chess(i);
: k  h7 e, {+ }6 A9 \6 v0 z2 w" [            chess(i) = t;/ [/ H- _8 e; P/ h/ C4 \

2 A* }! r2 C8 C: F            main(i - chess(k) + n) = 1;: {& ^  J. ~- A' b% i; Y
            deputy(i + chess(k) - 1) = 1;
& I6 }7 ~( d, d( {9 L7 O9 @6 _* D; }' E  s' W# S% w0 N" T0 F  A7 \  J
            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用; s9 ?+ s: O& `9 D$ G
- C0 m  B) e2 `" O, P
            t = chess(k); % 回溯
3 y* o& O, T5 b! Z1 t3 O3 j0 [            chess(k) = chess(i);" m! y% \; i/ f( c. z
            chess(i) = t;! j( X; ^. ?6 n3 |+ ]0 t" @
8 S+ w# z( G! @  |4 n
            main(i - chess(k) + n) = 0;* ~: u  T- @" w2 m: i( N; n9 A2 K
            deputy(i + chess(k) - 1) = 0;* L6 O. G1 [) K$ m. q/ w

0 g8 T( t& f2 e' L. Y% {这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。; _: y2 o1 U! v
        end
" G$ F4 ~: [& d9 ^1 p- C    end8 [; `. _# U8 ^/ r6 }$ \1 q0 {
end
8 }4 `# v6 O; T/ z0 x
6 N; \7 d- v# s! x4 Y0 V! c$ p' C) i这结束了循环和函数。如果i不是9,循环将继续到下一行。
- b) O% @! {* g# z8 I, Jclear all4 Q& z& s$ B4 ~- F7 I; y/ W8 _
clc
+ S' a7 q$ K; M, p) @$ s2 \0 O/ _+ ^
这些命令清除工作区和命令窗口。
7 C% V: G$ P7 ^0 u! ?; f1 Gn = 8;
; N3 U" M! @: O4 Fchess = zeros(1, n);
5 e  ?3 B/ |- v2 a# E7 vfor i = 1:n
# }9 Y; x0 `6 @9 G: V! I/ [0 W    chess(i) = i;
% Z2 c/ C; C4 Q0 P3 l5 x! `0 rend
3 w8 u! ?) ^* H+ L
# M: c9 z2 }7 \, `" D这初始化了一个带有皇后的第一行的棋盘。
8 p  J5 _/ i/ {& I! m! l1 jmain = zeros(1, 2 * n - 1); % 记录主对角线的使用情况# E, m! y/ \, H/ A1 h  K  X
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况, I- f$ v; @: \8 V5 O1 u$ G
number = 0;) M, c  Z) D) F7 i; S5 e5 o: |. I
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
8 A* D; \" d/ t( R+ {) d7 ^/ v% K& A% \8 q" v. f* f
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
# X" x, _; e! t# B& w8 w' |& ^0 _1 H8 ]
$ ^- f. x: s& E
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, 2025-8-18 23:26 , Processed in 0.236439 second(s), 50 queries .

回顶部