QQ登录

只需要一步,快速开始

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

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

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

1171

主题

4

听众

2778

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
' {3 @+ I" r8 f8 T2 P9 A1 U4 {让我们逐步解释这段代码:
* ^5 D2 n2 ^" J  C: f5 `function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)" I% G) v: L! v
& P/ h& u, W: z1 N. W& R3 E. p
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
% W/ A1 A. W" c1 ~$ rif i == 9+ f: A8 Y9 U# e! s7 z
    number = number + 1;
+ Y9 v: W+ w' Q! \    chess6 C1 M* w- I4 K% _1 N2 ?
else1 m7 M# q/ h. N9 }
    for k = i:8; O+ J! e9 v1 D; i0 F% Q
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0" T3 I5 g2 {! x$ y0 w- t. [; F; U
- ^% S0 a; Z. z) [. l9 l* G, p1 ~
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。- a0 E' \6 A# X( y1 K& I
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。3 T1 M& K7 \) m9 E
            t = chess(k); % 交换位置
' O. S. N2 t) j' T& H) S/ W            chess(k) = chess(i);* g( k9 w" g/ b/ W  }# H
            chess(i) = t;
9 q4 s/ q, D  L' w
! c7 d( r5 a4 X8 l! v2 f" f$ ?            main(i - chess(k) + n) = 1;  N+ R% N6 G$ E: Y1 f3 S# r+ s
            deputy(i + chess(k) - 1) = 1;
2 ]* l5 Q0 D6 C) M; `+ O$ h, n# K1 B
            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用& K1 h( @% K" @" W. ?

  D: t: K3 {8 ]9 d            t = chess(k); % 回溯1 d1 R: V; q& j% s( }" X
            chess(k) = chess(i);& ]- E7 V" G1 Q4 P
            chess(i) = t;5 b2 _" i  U5 y3 Q3 N4 H, Z2 T( `

$ D- @( A4 r- i5 ^1 Q0 I' a            main(i - chess(k) + n) = 0;
! v/ p* k1 R' g0 y% ]: y            deputy(i + chess(k) - 1) = 0;
. e7 B' T, {+ x* r6 e* h3 F: _( ?' w9 w  L; j
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
! x* e/ p; i0 B0 w* [7 a; _: |: m        end
6 ]: G( k1 A: z8 E    end3 j% c2 K0 y# Z6 M" h5 J; T9 a
end5 Y! R6 O- t' d: ~
9 `# ]9 h: M5 m/ P$ D! s* `
这结束了循环和函数。如果i不是9,循环将继续到下一行。+ |+ M/ c7 v# X/ E9 _/ ^
clear all" |5 n$ Y/ _: \$ V! C" q+ _7 U
clc+ }. }: n& p* {" m: g7 t& Q6 ?
; \  L8 D0 S# U+ {) G# Q6 {9 o
这些命令清除工作区和命令窗口。
$ E( G: ]7 E4 p" W0 yn = 8;  J  Y/ v4 l' f# M9 }
chess = zeros(1, n);- p/ M$ M2 E" E0 N
for i = 1:n
3 S. s7 M# x. j    chess(i) = i;! d4 p+ [9 u* j! c( g$ q, U  i4 J) j$ T
end
. S9 o; A3 t: W4 `* d( v" u- L
这初始化了一个带有皇后的第一行的棋盘。
  }- d9 G! |" z! ?2 ], u5 H* cmain = zeros(1, 2 * n - 1); % 记录主对角线的使用情况
. Z0 a4 ~4 y: tdeputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况0 j0 A  y0 L+ k% B7 x1 o$ D
number = 0;6 U6 N( ^/ t, F, O1 P$ G* G) ?! C
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);5 }  y2 f6 I8 l* m

! _8 l2 c: C- e. y0 `4 J这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。- h3 {9 z6 ]; ?* Q1 V( F

+ x2 g8 u5 S2 |4 ?) F* a
7 b5 A4 X9 S' E* ]) o% f$ n. b- U* O! y: W, h

排列树的回溯搜索.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, 2025-6-22 19:25 , Processed in 0.526630 second(s), 54 queries .

回顶部