QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。0 H. `7 i( \+ y3 C4 }2 e7 D
让我们逐步解释这段代码:
- I$ o; V% M/ ?9 S/ e2 e/ Nfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
2 Q4 L7 b+ d2 o; E+ i( w5 X2 H; x: z4 z
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
  Y- R! w4 _8 [8 uif i == 9
: f/ c0 h* S; ~, i- X9 C& e% t    number = number + 1;
5 [8 g4 B$ V% T) T$ g    chess
8 O2 P1 t5 R4 ^) {$ \else
2 ?- ~9 [; c: A7 o    for k = i:8
5 ?8 D! d& S$ J2 R        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0
+ b" I4 `, e+ |% e$ g. B1 n5 n  O% a3 w1 O- ?) r( H; f
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。- ]4 O) K# E2 ^: n
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
% c' z1 R; V2 V7 u+ t0 x; U+ K4 J            t = chess(k); % 交换位置
" I+ P# p! P3 p+ J7 b3 R& G            chess(k) = chess(i);' A1 K+ H3 Y0 X7 e" K2 q1 j
            chess(i) = t;& J5 ?- U% e, Y$ e( T( r  P
6 q5 [+ l' i$ C  M, h+ ^
            main(i - chess(k) + n) = 1;& U$ ^/ Y9 X, W/ v9 W
            deputy(i + chess(k) - 1) = 1;$ `* |- c$ h8 L" o' B# }

# L) Q/ i8 e0 X' |  w            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用) B( y2 |8 i# z3 A0 c

$ X  L5 Z# r( A: W! s' M0 N3 B            t = chess(k); % 回溯2 _8 ]. h/ g4 B5 L( ^) X
            chess(k) = chess(i);
/ \8 C1 S5 U7 u/ o" K/ a' e            chess(i) = t;' U4 n" D3 \3 W. a: T% ~

9 Y: R% @/ t5 k8 `6 A            main(i - chess(k) + n) = 0;% ~7 H' N+ A1 [$ m) y1 u
            deputy(i + chess(k) - 1) = 0;7 w3 n' i6 V; j2 K
+ d- \- W" w: h* z5 Y! ~" e9 B
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
# @8 X  t1 n' ^        end$ B6 W1 N1 O! f" C" K4 f
    end
' B) V+ w& b  W7 H9 Rend
! T, w1 c, ^: o8 X0 F
+ K; {: |4 P1 h5 b' F1 {# z这结束了循环和函数。如果i不是9,循环将继续到下一行。
: U# k$ _9 l: P* i  \! I0 gclear all0 ^: l6 i$ L( e6 ]4 k! \+ ?, p! X/ z
clc
$ G/ R% U4 x3 w2 b7 t- X( V
8 @+ K) D& N$ k  S这些命令清除工作区和命令窗口。8 h% p' X' X6 s' ]  a* h4 b
n = 8;
9 C2 W6 @# w# j8 pchess = zeros(1, n);; n2 L% z7 a8 u4 E$ ]
for i = 1:n7 C7 ^& S& v5 W5 H' a% x
    chess(i) = i;: J$ T3 \0 D0 s( ~' i! e: X2 m( `0 V
end- B8 T0 t. h( y, e. E. A
3 o( W3 B  `9 _4 m4 G  m1 z. I& `0 }" b
这初始化了一个带有皇后的第一行的棋盘。% `. z$ v- P7 s+ ^
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况; [6 e* a7 y( @$ k8 Q6 D
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况( V* a6 B5 T/ c. o6 T7 C
number = 0;
) I6 }. ^; f9 p[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);6 S- `: N' T! F& F  C- v( u; V, D

9 ~+ [% a% ^$ _5 e  H" C! m. C这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。" ^1 W+ C# W8 g! i4 F4 \; x1 K" h
9 {9 R5 B, Q* r" h3 ]/ |
! X' A" S* J& a; J# d+ x" W4 x* J9 S/ i
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-8-1 03:46 , Processed in 2.161826 second(s), 51 queries .

回顶部