QQ登录

只需要一步,快速开始

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

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

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。) Y: A- T& d+ E4 l8 [0 D6 Y
让我们逐步解释这段代码:
) ^, z3 w" E6 ~) f' {function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
! V7 h/ P7 W0 O6 U
- _6 f' ?  f/ y& x, @这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。7 _; F# T* Z1 V- J) a2 ~; `
if i == 94 b8 H/ M. K9 p7 B# j
    number = number + 1;; Y: M1 W0 M  x- V; E% k
    chess
; E# D  j; I4 X  V/ e3 i% Y& O* J6 K# ^else- ?$ z4 J) q' ?; J2 c
    for k = i:8
6 c5 W) x6 a" I* y) }" t        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0# _: F& j+ _) t3 U3 p9 i" y# T+ c

/ j" c' c) ?& H7 G/ |7 y这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。4 n, P. D4 e6 `8 l* }) P
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。; u% n* a4 R- s7 z
            t = chess(k); % 交换位置7 d0 Z/ V  s- S3 e4 M6 B
            chess(k) = chess(i);
! ?* y/ V* j4 C1 |            chess(i) = t;6 Q7 ^0 H( ^4 u% }

4 k. E  z9 y: Y9 P9 w8 q            main(i - chess(k) + n) = 1;
5 m/ u7 x" k4 H! q% n9 Q: v            deputy(i + chess(k) - 1) = 1;
" s. B9 W  G9 ?9 o' l! C7 n. o6 s
7 g9 t& P9 _+ e3 j            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
. ?/ Z1 H/ O* U! e% w1 v( G
1 K6 J: j8 h0 J( c' F! G, B# l            t = chess(k); % 回溯
+ b; `% ?- @) O/ R& K, D* h  U            chess(k) = chess(i);) L  M: R" Q/ q. r' T" D
            chess(i) = t;- H+ ~9 P# }; {" X0 m

) w+ P% o% u0 h- D+ L9 F6 u. j/ r            main(i - chess(k) + n) = 0;
  b: ~& D- j! [/ \' ^            deputy(i + chess(k) - 1) = 0;
/ E+ N9 `; A  o+ v
# M6 f5 R" `$ I- c这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。$ N: [* O" A# L. f& |6 p$ d* e
        end+ R, O" l5 \5 b( p3 n8 P
    end
2 V5 H, d# G9 O, c7 _) p: Zend
3 R1 m% h* b4 x& O) q# A) _* S3 \
0 Q* \( L+ _% }$ [: a这结束了循环和函数。如果i不是9,循环将继续到下一行。
$ H: K7 `$ N" v- v1 K9 kclear all
+ x( g! B0 T0 x* N; H* h6 \* `+ ^4 Pclc
; ^* `6 O1 |$ }  q' R9 f3 T/ s
% V7 m1 {) T( }$ Y: U这些命令清除工作区和命令窗口。/ N' c% {! ?" b% T
n = 8;
( d+ a% d$ _: F, wchess = zeros(1, n);
4 k+ g* a9 U1 E9 N. hfor i = 1:n5 J- t3 i( N6 P3 M9 [: t, p
    chess(i) = i;
" r: z3 B: K4 m; [. U" ^end
8 z4 ?* _4 C- N  F7 u+ e0 }# e7 R- B4 V+ z, Z
这初始化了一个带有皇后的第一行的棋盘。
6 {+ j9 K8 W. X2 T) G1 L' zmain = zeros(1, 2 * n - 1); % 记录主对角线的使用情况
& o* E/ p4 |' U$ N$ [. P) J/ ideputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
7 v7 p2 b% q2 Gnumber = 0;( R1 X  K" ]  r8 k( ~/ \! r
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
. S5 ~8 e0 R, }7 L& _! @; W3 U# m) _
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。' s& {* r4 W: g, H/ g; w
1 N( r% I- E# ]2 y9 `$ i

/ o1 m9 U* v8 c; x! `* K% f9 U$ r
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-6-24 03:51 , Processed in 0.305777 second(s), 50 queries .

回顶部