QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2838

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
7 z' F1 r* |6 Q) }) W让我们逐步解释这段代码:
* D3 ]$ M2 c# Q6 F( Mfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
. d' P2 y: u7 V6 K# q* |& ^
& g3 F1 t) D8 f! c这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。( W# h. r  U7 g9 t8 {7 _# e
if i == 9! m6 \+ K" D) [- H
    number = number + 1;9 f- t3 K% J: ~5 V9 M
    chess
, b! S+ w0 O) ^* T& \# nelse
2 l) }" y. t4 X1 ?    for k = i:84 |: t# D+ P% C1 l; h
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0/ h2 L8 P$ g$ ]2 Q7 g4 c- h! @+ I
, D5 A  v/ L: [% q; v$ |
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。% ~5 I+ a2 j& ^" }6 F# N! x* o
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
" p* t* |5 a0 g, {' [/ u            t = chess(k); % 交换位置
8 @3 [& U: k9 `; i            chess(k) = chess(i);- R" X/ k+ P8 U3 x* F' y. ~
            chess(i) = t;- u! c, r8 p1 n; A+ r
" k& |$ q+ w# r
            main(i - chess(k) + n) = 1;5 x+ D% J0 I$ N+ ]
            deputy(i + chess(k) - 1) = 1;
% p  u* \  o  d' b" O' ^" j6 o
5 @3 Y4 u' S- ^( V8 @4 }            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
/ H' R3 z/ \* j) a# G+ V! p  F- K, m9 r. K
            t = chess(k); % 回溯6 I, Y) w1 |& Y+ j: J2 `0 l' \4 Q
            chess(k) = chess(i);' Z; G9 }; X2 C* D6 h' h: V& n) m
            chess(i) = t;) |7 b2 N( ]% B9 B

  o; j) V+ J; }0 f0 c7 y3 F            main(i - chess(k) + n) = 0;
7 l5 `! ~. c; j* }/ ?& b            deputy(i + chess(k) - 1) = 0;
! a' G" y* }- h' G$ w/ c3 t9 }6 h( J% l" P$ ^
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。* j& j% U" i3 @0 M5 S- [! }
        end
# ^3 R% Y# y& A* W4 W6 W    end
; l5 x; S, O* V1 uend
+ `1 l( h: u3 F0 g" d4 W9 o
* Q- k+ j' r# i9 R4 K. D这结束了循环和函数。如果i不是9,循环将继续到下一行。; }# s# v0 i# `2 G: l# p7 v
clear all
4 k% l# P% j, g0 A& M" u2 sclc! S0 ?* t( V, F. ^

1 ?$ |7 ?( v0 |  j这些命令清除工作区和命令窗口。
/ c  G) X; B9 s  Y3 l* cn = 8;4 B& [. A6 c  @# ~+ g
chess = zeros(1, n);
, V' y8 R: `( \( I* Kfor i = 1:n
: P; e' S' m4 L" v    chess(i) = i;9 E8 E. g7 m6 V9 n8 }
end4 S' U. V! \+ F2 Z  g4 B2 F  A
! p% w7 C1 }( \& [2 g
这初始化了一个带有皇后的第一行的棋盘。$ [' @7 y: }2 s
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况* Y4 o; g% h8 Q2 a( @
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况0 }4 y& s# B7 Y: {
number = 0;
# e9 O9 p8 C0 E4 G5 u# C5 A[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);+ L2 x5 A+ U# }. P/ {/ g, f

6 z+ g( z2 V! k4 u这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。; K( z. x' C( R( P' W1 b

9 U! K6 x+ y! G( j1 d2 q, \+ G/ c
& T8 @9 I" R: o
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-7-25 17:30 , Processed in 0.619770 second(s), 51 queries .

回顶部