QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。& R% f' O) P. M5 R% j
让我们逐步解释这段代码:3 f) e$ a1 B4 q' D) T, U
function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
/ [3 i; d" m+ @& Y3 H3 c9 Z% m- r  \+ H, |& Z
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
: E8 [; |0 v. Pif i == 90 ^5 R. I% X& N1 D0 `  R4 ?
    number = number + 1;) ]& [8 V8 ~) L5 I9 d
    chess9 w- `2 g% W) |" H6 Y
else
% R- \* \' Q3 L: c! [    for k = i:8
9 K! m0 D, L" L# ]" m5 c        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0; b# L6 l1 c/ ]9 L% m* [

6 x/ V" [6 I7 C: D3 Z" P3 n* e这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。5 A: Y' C" _, O* y
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
" E0 ~. H  _8 C* \! g$ [1 g            t = chess(k); % 交换位置
3 _: k# Y& U1 o3 o5 g0 R            chess(k) = chess(i);
5 A9 r% m+ V8 S: J. N- V4 W- G            chess(i) = t;
6 Y& C- D% Q. o: `! g; _3 R/ w
! E1 _- J) }9 N9 O9 A            main(i - chess(k) + n) = 1;4 ]7 s' \% \) U# d5 M* `( t
            deputy(i + chess(k) - 1) = 1;, K9 N; C7 t2 \1 _

- h$ b! y/ A) ?# L" B4 D3 ~            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
* c3 }6 k% c" R: d" U% G
/ x' ?' K7 I1 N) q0 T            t = chess(k); % 回溯: ~, `4 b& l& s( ?& M
            chess(k) = chess(i);. ]+ Y( W8 B7 h
            chess(i) = t;
$ q2 }4 ~! N* c9 Y7 r) ^8 O2 z* _0 e( {6 c8 J  U% r8 f
            main(i - chess(k) + n) = 0;. u; j% V4 A* a
            deputy(i + chess(k) - 1) = 0;( t, j3 r" x8 V0 W  C4 {" M

: l: R: x2 L0 y7 l. j这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。) I2 P- K1 ]. m* C
        end' j0 I5 O0 ^& L0 t
    end
$ z: J  V# D+ ]. p% D$ Uend- q6 w" ^! G& g- v3 m4 o

# s, c4 j5 @9 f4 r+ l2 N这结束了循环和函数。如果i不是9,循环将继续到下一行。1 [4 M  }3 d' q
clear all3 `: ?) I/ @7 r" q' }- t& _+ R
clc, a: j/ e) ~8 \3 ?9 \
; `, Q& x+ V% `  I* ?
这些命令清除工作区和命令窗口。# A$ x, ~* G2 M* j6 y
n = 8;
9 ?; ^  t! T- ]4 C5 g9 q" Vchess = zeros(1, n);3 T. U1 n" x) x! o( G3 u' `
for i = 1:n: }- i8 _6 K$ p$ l; t
    chess(i) = i;
- V( A9 E( `6 T/ X/ r8 g$ m  D# Send" a  a, v9 d# J! P& N0 p0 a/ `

6 Y/ d3 n3 D/ t8 J+ {6 v4 k这初始化了一个带有皇后的第一行的棋盘。8 L5 z- S4 `* x2 M1 O' S! H5 w. f. ]  C
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况
" }" ]; x/ L! |8 K2 A6 W; g6 z: _deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
0 T$ H/ ?* v1 n$ ^" D: Bnumber = 0;
- T0 |" t4 p% Y; k% E[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);4 ~' T1 y. ]% B  @

( n, E/ U# ~; w这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
" ~5 H2 P! H/ L: G5 P0 ~; P3 F8 I+ _/ u  j/ s

' b* f! O$ M" Y# u, b, M/ u
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 15:02 , Processed in 0.399510 second(s), 51 queries .

回顶部