QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
: w4 Q- l4 o8 Q/ N' J让我们逐步解释这段代码:
3 {- t1 }% h' Q$ sfunction [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)# K$ Y1 y, U7 }* a2 |! J" t

7 S# b; @( s' J这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。0 n3 X- u$ `: J4 y0 S
if i == 98 }( _) g" Y8 ?/ E1 W& Y9 U
    number = number + 1;/ w: K, W" y7 I$ d9 T, R5 A6 W$ V
    chess
  w) L8 b& ^- V  l  }$ X6 `else4 b7 ^0 m' X2 h$ e6 i' ~8 O' H
    for k = i:88 _, n1 }( G! Q; D8 f2 t
        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 01 h; ]  q2 e, V' Z* c) ?
  m& \( E8 x( V- X+ L" L- B& w
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。" ?9 t- v$ q- O7 l4 N! k! s- H0 }
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
2 g$ M+ |. d* C, q: m            t = chess(k); % 交换位置
! W) b6 q0 v, `" n  U            chess(k) = chess(i);
; [  V. R; R1 j            chess(i) = t;
2 ^! L8 B- `: K9 _! U! N
( A' k9 K* H: {: G9 k            main(i - chess(k) + n) = 1;8 H5 ?5 B+ H' U# r, |$ _8 p0 C
            deputy(i + chess(k) - 1) = 1;
% ?1 y) D) K. D" Q, n% J3 _8 a2 T, g+ w
            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用: A4 R' {  b4 e" i* h

" f+ }6 l9 h% K            t = chess(k); % 回溯9 @. U; ?* s, ~& {
            chess(k) = chess(i);
' G- N3 e! y( t4 a% f            chess(i) = t;
( k+ J! G3 x4 F  d( V, ?- e% {* N1 }9 }2 L/ d
            main(i - chess(k) + n) = 0;" U7 l2 O7 i1 y8 @* D9 L" q9 q4 i
            deputy(i + chess(k) - 1) = 0;
, M7 Z5 n, S* r1 \; E
+ ]5 s7 \8 @! N9 _  C这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
; \5 E1 @3 H9 _7 f! _& T        end! W9 f3 z/ S1 X( ^( |! k& Z
    end
, ?3 {6 ]8 A$ X6 A1 Z7 @end
, W: F) m) r( z2 `7 K' V! U! v2 X9 h3 S" s- }  V
这结束了循环和函数。如果i不是9,循环将继续到下一行。& F& ?/ p8 T8 ^2 p2 Q8 Y
clear all0 U8 L7 Z- Y3 I4 A
clc
+ O3 [* Y, y, z  M4 a1 e" i7 H1 L7 W3 |/ e$ `
这些命令清除工作区和命令窗口。$ @* v& m1 f9 i. E
n = 8;
' `5 `  P2 [5 M# W/ pchess = zeros(1, n);5 x- G8 n" S& P0 ]
for i = 1:n4 g+ l9 X1 C; ^4 d
    chess(i) = i;4 b8 o8 G% Y& i/ g* Q9 w
end# ]4 X; C1 F) r2 f5 C$ S
( n7 `! m6 L1 J: ^/ D
这初始化了一个带有皇后的第一行的棋盘。
7 _. J4 h: i: \) T8 I/ @main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况2 e' h: u/ @! w# U4 H. X) a( {
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况$ y2 w5 A" w* W! C+ Z
number = 0;
) P: ?1 h% k0 B$ k! ^[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);* Y" {- T. }  c

" {+ L2 R0 {  f# e2 q# K这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
2 ^: D6 ^, T$ f
. p& s3 D( W0 q
# s. ^! m3 z+ m' b; D/ b# @) t7 M4 p% a+ V

排列树的回溯搜索.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 10:33 , Processed in 0.450071 second(s), 55 queries .

回顶部