QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
: h$ L  T, G1 p! G1 w让我们逐步解释这段代码:
& P) h  m) b* O2 a* n& X% dfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
1 S. N6 t1 G& n  v8 h0 s; f* L. G) |9 u% r# X
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
. C# B4 l6 u6 _* D4 u4 u4 Aif i == 9
  i" J9 U: f" P/ U& z    number = number + 1;( ^9 I) v8 d; l6 ?; x
    chess5 G5 G4 W( s" a1 I( Q
else( S- W- z# {" l- M; y# }
    for k = i:8- H9 F# z6 U" \6 u
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 07 \/ v- j8 w( o$ c4 a1 Z# ]

6 D8 }* {0 t+ u这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。7 a8 W( _3 `8 F& o3 n$ _7 Q; g
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。( E* h" _: L* [
            t = chess(k); % 交换位置" P4 f$ ]$ ?) h4 \# H: M
            chess(k) = chess(i);
' ?% Y5 d) v3 R; l0 J3 i/ [            chess(i) = t;- H6 v1 ]& M, e8 Y" M: S- }

0 o6 ^8 h. ?3 {# Y: t$ F            main(i - chess(k) + n) = 1;
  c0 H3 P* l& {2 Y            deputy(i + chess(k) - 1) = 1;
- z8 |* U: I/ N, K5 a+ k7 N2 x
; q+ Z* c+ A& f1 O  ~/ n" r$ U            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
0 \" n7 i% [2 N, C. `8 z  l+ k2 ]' S/ L, O
            t = chess(k); % 回溯, }. r' ^8 I4 G' ?8 j5 y
            chess(k) = chess(i);) O0 T6 Z# _$ b2 K/ h* z( W" z
            chess(i) = t;
% h9 w* f2 {2 ~+ i
+ }* q7 [# r# B# l3 y& k# T  j$ H            main(i - chess(k) + n) = 0;
8 B6 ^5 i3 Y: \* A            deputy(i + chess(k) - 1) = 0;4 w1 G0 z7 [& R- m! P4 s9 e! k  G! v
" Y# C! Z# q6 x/ ?0 R
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。8 V6 D7 j: r) S! v3 J9 [3 y
        end1 l9 k5 g6 c- H
    end
# ~! b! X: q; r* Y3 c# Q9 bend3 I7 I7 Y: y4 K3 Q4 {, u5 v4 ^
( l8 i5 R8 |- F" W2 b5 I5 z
这结束了循环和函数。如果i不是9,循环将继续到下一行。
- U: I+ x7 C% D# u* ^clear all$ l, V! w; d3 H6 U8 V% m, I
clc9 j- d4 |. b5 Y; N

5 A2 a4 L- ]8 \+ g' K/ {" G, C这些命令清除工作区和命令窗口。; P% a' [& X/ ~! L# I( |- O4 O
n = 8;
$ v2 i  R0 f* d+ Q- O5 Kchess = zeros(1, n);
. f1 ^3 G: g  k! Y  P$ R- M2 Xfor i = 1:n$ @# V3 a' F4 b
    chess(i) = i;
% ^. J3 m6 ]* D) H( Iend
: W, M1 _4 g/ h# Y4 a, `5 P& R9 J: s& n2 T0 J! A1 @# z" q
这初始化了一个带有皇后的第一行的棋盘。
0 R) k' ]8 H8 w6 P6 Y' L* wmain = zeros(1, 2 * n - 1); % 记录主对角线的使用情况
# P7 v% o2 M% t6 M7 T, X, ndeputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
4 \' _' M5 ~& U- qnumber = 0;
: ^% [! A  z' J4 C: X[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);5 _  M, E8 M; ^- Q" h5 X8 [% M! x) p

( y% v; }% O9 G! H, P; p/ p这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
4 w, n: z5 g; ]# b
) J; m$ D) t+ T; }0 P5 [& a5 G  ?6 F0 v7 b) c1 g9 W
. R4 O% y+ V% v

排列树的回溯搜索.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-7-10 12:05 , Processed in 0.403711 second(s), 54 queries .

回顶部