QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
1 G2 C7 o$ v3 ^$ S0 d6 q4 E7 E8 G让我们逐步解释这段代码:* h  P9 `& J4 n$ c$ n
function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)7 L* `% ^# l8 S& q* t& q3 l

5 U& F2 ^9 e8 m: |这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
  b! j, H0 q$ v& G+ T7 _if i == 9
) ^1 \" {( F) f/ s, m9 Z' Y3 }    number = number + 1;
* k9 Q, W4 d/ X& ]2 x    chess
3 y9 K( G7 y& U& S5 Delse! X7 T' K9 O  l  [
    for k = i:8
: B  @: E# X; q% G2 Q$ q" G0 U        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0
8 x6 t. S1 O) ~, R  }
4 Z7 a5 j0 `5 d% Q3 J2 y- B这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。& M! q) r+ H- ~2 U: q
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
: E( `5 K* W& w0 V! p$ T" t            t = chess(k); % 交换位置# P1 i' S- y; W8 ?% V
            chess(k) = chess(i);3 |" t( ?* q1 `; d# F' y  x
            chess(i) = t;
( T7 x$ ^, }) i1 R, \: A8 f* `& I# K; E4 t1 C
            main(i - chess(k) + n) = 1;5 L2 `3 q( h3 A9 S! b  B
            deputy(i + chess(k) - 1) = 1;" t( y' L5 a1 f/ }2 `

# \$ W- R# t6 A- h9 L, }. k! h            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用/ o1 A0 N  C# y- R( g

$ D- N' n& S8 x+ [' n, K7 \2 d            t = chess(k); % 回溯6 Y) n% i! b" K8 `
            chess(k) = chess(i);
7 B( ]; ]% S2 ]( ]' Z            chess(i) = t;
: F  @/ ]2 q# `# f: C6 T4 D5 C  M. i& E5 q" U: D3 B' W
            main(i - chess(k) + n) = 0;# ~7 I$ d. d+ x5 E" m# ~
            deputy(i + chess(k) - 1) = 0;- [$ E) a0 b. o8 h, h9 J6 b

8 c1 K. i4 X, u6 {: d这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。, K, G) g( O. @2 Z, l* [1 F
        end
! O7 i; i7 |3 U  n    end
& J6 t3 I. y8 ^% ~end
) ]4 _3 |- w2 P8 u' P7 P5 k* L  i& `6 }8 y4 |2 n! M
这结束了循环和函数。如果i不是9,循环将继续到下一行。
1 B" o* s# N* x$ G" k: Aclear all
0 b1 B- Z; n) O! Y, a  s6 A9 `clc
  R6 f1 G, C! U% ]; D* T
: _( U. P2 D& ~; y0 G# e这些命令清除工作区和命令窗口。, k  S, D7 J+ b! r4 X
n = 8;- ], W) w) L& a- b
chess = zeros(1, n);
9 Q) [' @3 s4 [$ G# l% Sfor i = 1:n) S+ h+ `/ ~# o$ v$ D- ~' r4 I- U1 j
    chess(i) = i;
; B6 a* g% D, x5 z5 g# S' l5 \end, {- G; ~! M1 Z8 k$ k" v

* E! S: }2 K$ @( z7 b这初始化了一个带有皇后的第一行的棋盘。% g2 N, A. @9 |$ Y
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况! D! h- J! v+ M0 N/ [+ f1 o
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
& d! L3 ^& P3 ~& |/ Anumber = 0;9 L  q( G6 T$ s; |
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
8 L$ q5 F( Z  f( V/ |: O5 {6 c8 j# }$ j6 B+ f( V
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
1 \! k5 [7 v+ J& i4 I; Z" k5 ~; T$ q3 l8 X0 C  |# r) [

) |9 E# ~8 |. V2 n4 U" u* B8 V1 e4 `' K8 X8 ]/ k9 I

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

回顶部