QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
" G; d9 u% p- g6 @$ J  _) C让我们逐步解释这段代码:
% X; Q. g0 E) \4 D/ Qfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
- ^+ Z- f  E; V) r- M; N9 N5 Z+ N! k7 p: y0 ~
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
$ ?) }: w# {' h5 kif i == 95 v$ s1 x7 V- d" j4 e! X( |
    number = number + 1;5 [% G% r3 P. V- U( A5 x" ^
    chess; r8 q: c1 Q3 `& N% R7 B3 ]
else
4 v3 w8 p; x+ _( G5 g& ^    for k = i:89 ^; n6 }+ C4 p9 N$ u
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0
9 l2 j( @" E2 b$ [, a# m, I$ J3 ]9 o( x
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。
! d+ `4 E7 Z+ c0 c" A- N* k. V* _嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。" m( p4 C  I+ u5 [& x  }0 O9 f8 l" m
            t = chess(k); % 交换位置# b# I+ q. y: [4 \: t: o3 x
            chess(k) = chess(i);" M; p0 c; @9 r. ~
            chess(i) = t;6 l) g! E* h5 I1 Y) X

5 k5 B3 X- |1 }1 a' N            main(i - chess(k) + n) = 1;0 Q) b" ]) ?* i0 q4 N9 j, d
            deputy(i + chess(k) - 1) = 1;( s  t% \6 q5 S7 H

: o8 r! {& l0 A) h% ?" Z2 t            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
$ f* p  r$ L" O
5 ^2 e4 ]6 I- F9 [7 L$ s            t = chess(k); % 回溯: t' q/ J, K4 G5 ~8 G7 p/ N
            chess(k) = chess(i);) }+ j4 D: @) l, }
            chess(i) = t;  {5 J/ B/ g) M# ]5 M+ q

3 z8 e5 Y# N+ S. k9 a+ [' Z            main(i - chess(k) + n) = 0;& f* V" m; X+ X. r  |" q! m
            deputy(i + chess(k) - 1) = 0;
% j! e; Q  ~" y) _8 _! z; j' p6 K) @$ F
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。, g2 d) F1 e) M, a/ h1 w$ T: b
        end
5 m3 g9 s8 ~  N! C8 o    end; W1 Y, @0 `. l$ G( m! ]7 m9 \
end# w5 F6 v0 v+ h* U+ n
( x, \* m+ f) P  r' U7 r$ v
这结束了循环和函数。如果i不是9,循环将继续到下一行。
, ?: e! r$ W! [/ X- w7 ?4 tclear all0 \/ l& E" S9 B# p. O- m( i1 Z
clc0 k8 ~' ^4 c8 f: O) d
4 b; v: P% C7 H; q
这些命令清除工作区和命令窗口。! Y7 o7 Q, n5 k7 u; T# h
n = 8;
' V' [3 a6 {" W+ R) [9 U) Fchess = zeros(1, n);% u  t. V9 K, o( R; h& _4 S
for i = 1:n# a+ U: e' [9 C0 T2 f$ a- M
    chess(i) = i;
1 h& K' @, F  f1 \; T5 Bend/ G7 j7 m* [; f9 L0 V/ O+ n
% T  D9 P$ a  n1 k" ?& b! o
这初始化了一个带有皇后的第一行的棋盘。( P# s5 A2 p" L4 ~. o
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况+ S6 ]# w- L$ n/ u
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
" I) T* A/ X$ [$ I4 c! Dnumber = 0;$ }5 W$ E2 C3 V0 Y7 B; W
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);$ F- j( u* z- E1 F1 _0 x/ M% G

! Q6 [& Q( i% p! q' F这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
  |+ o" ?& n6 F3 [
. D. f" s2 {1 O, [: `( h. k9 r: L# s$ }( v' f  W
5 `, R5 J  h, b7 y' k( u, K& ~

排列树的回溯搜索.rar

694 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

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-10-17 05:13 , Processed in 3.095479 second(s), 56 queries .

回顶部