QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2849

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。9 f1 ^7 B. P5 u1 G" W
让我们逐步解释这段代码:; Z4 f$ L: U* S  n# X( i0 D
function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
( s* J% P2 a+ f* a% r; x+ k9 R5 n- }0 j# m
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。; U4 i* t2 ]* ], t& Z6 j1 k
if i == 9
. C. V% S0 _5 ^* Y+ a7 x    number = number + 1;( Q; ]& G6 M  M; Z6 }% \
    chess. R" f. O: l7 q9 U) I( Y
else
0 m2 E0 M& E* ]6 ~- I. g    for k = i:8
5 T6 q8 v1 B$ f/ j' F; @. v" }        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0) \2 s9 R& b3 A7 d9 g1 w& S

4 n0 t" V5 L( B9 I! l, ]这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。1 Z8 {' i: g/ J( [/ K1 b
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
( v# u$ E# p" |6 U" C# I& l            t = chess(k); % 交换位置
' P3 X# q  s0 U! f: g. B            chess(k) = chess(i);
0 C3 b; ~6 W: Q1 s& k& M            chess(i) = t;* g0 X2 U' r# e/ ~% y" p

. c: N# {" S: h            main(i - chess(k) + n) = 1;- D& N9 g9 e" {! z# E5 {: Y
            deputy(i + chess(k) - 1) = 1;! l% v" f/ z# j9 C0 r

3 h% i7 M1 b2 D! V( F            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用  c  ?* K# E: |0 j* Z# E
) Z& k3 C2 D4 Y9 E$ e5 s( B/ t
            t = chess(k); % 回溯4 s4 @& r  J5 a$ Z, N3 K3 q
            chess(k) = chess(i);# x2 M: r; I0 ~& |5 f9 z. l
            chess(i) = t;# Q8 Y( X% x; V2 @0 o

( W7 G. o* f# s& q# V8 l            main(i - chess(k) + n) = 0;
5 ]7 I8 M6 a, m% I6 u            deputy(i + chess(k) - 1) = 0;
+ Y4 |5 p+ z# ^& p/ a- ^
& i( M. R6 \1 _, {- C2 v8 ^0 S' S这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
. S5 y" {5 {6 W3 n* G        end
, \7 g0 v) A4 `9 [+ z# f# N    end
" W* T4 l1 j  c) V  Jend) f0 r2 k8 e/ d
; e  J0 _  h3 x1 B
这结束了循环和函数。如果i不是9,循环将继续到下一行。: ?6 s" R7 P/ M- C
clear all
; Y. D4 f6 Y! c, Q: kclc) r% u) B5 g: j, h2 Z2 v

5 S& }1 U0 A! |! }9 c这些命令清除工作区和命令窗口。3 ^- U' [% a. f7 e2 k
n = 8;
  B$ _& B$ E$ |1 n. b/ o0 jchess = zeros(1, n);
% E4 l9 }& |' F/ o7 |, r) Nfor i = 1:n8 Y+ i" K! x* m& F/ U, `1 c
    chess(i) = i;
4 N  t. g" q* z# h; h, Cend7 L5 I; w8 S# r0 a
3 m" W+ G7 d/ j. m( s
这初始化了一个带有皇后的第一行的棋盘。" }! T7 N' r- Z
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况- u- z% Q: `8 i& `3 L
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况7 n: s2 s, X: r1 [$ ^: r8 \4 J5 z! @
number = 0;
) O7 j& I  ?; h" S8 Q; ^5 K2 g; h: `[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
; a/ e. n. I& @- Y" O" d. q4 j# W) L5 T4 G: {, O# Q  L
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
. A: s) q5 W6 `: Z) `
- t3 ]8 T) Z( l- p" Z/ n7 d% O" t: v4 D

9 e6 _! n( ~* Z

排列树的回溯搜索.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-8-4 08:42 , Processed in 0.732565 second(s), 55 queries .

回顶部