QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。* n, f! r1 o" }
让我们逐步解释这段代码:, C! a; ^2 O! U2 T) A
function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
# Y) ~" U5 H; [
6 T, A9 u9 ]2 Q% I4 O这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
& f. V& I+ I/ S3 rif i == 9
' W+ ^" y/ M: S9 G" z    number = number + 1;
; w  z0 Z6 Q, X( z* j) y4 r+ D    chess
1 _% G7 z( ]% Ielse
. D; g6 A/ B2 |% q$ w* u+ k    for k = i:8
8 R9 z* ^# L5 t  V  u) }# B        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0
  z$ ?& x- L, h
, Y, z) `; k2 }7 F# x这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。7 U( U) [# p. o& N' o" n! E& Q
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
9 a4 U$ J# ~* g' W. [            t = chess(k); % 交换位置
' Z2 Z  }+ s, f" p            chess(k) = chess(i);1 ]/ Y* j# |  O( u! U* f9 \1 s8 `
            chess(i) = t;) k& v0 X: R5 r$ x: M5 I5 V% N+ H

7 b" c5 ~* u7 G8 i4 z7 f0 o            main(i - chess(k) + n) = 1;
; E/ u9 u, r. }- Q1 ^0 q9 W& E            deputy(i + chess(k) - 1) = 1;3 Z8 a6 M! y8 s; M' F) w9 `) x
. o7 p8 q9 t7 i* X8 ~
            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用% j( [- o. I$ E6 d% B) R0 Q
$ X8 Y% Q8 _6 T
            t = chess(k); % 回溯: J& X( {) d' `' s% e
            chess(k) = chess(i);6 o( D( ]* S& L- ~: G* D& g: q/ g
            chess(i) = t;
$ `. \. m/ l: E3 e& _- l2 l% n" C* C/ d3 M+ e9 f) U
            main(i - chess(k) + n) = 0;+ `' Z( _: Z2 @
            deputy(i + chess(k) - 1) = 0;4 E6 D  s; L+ P, @3 b

: _, E8 t4 f6 U9 S这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
$ Q+ X+ z" q" H$ p. H        end
  z1 C  T+ A6 @( U5 u! B! V    end
) g$ x3 p/ Q- lend  A3 N# e' c7 p2 U% F4 Z

3 k* B  V5 H: O( D8 ?: g这结束了循环和函数。如果i不是9,循环将继续到下一行。
4 y; G. Q0 X5 U$ A1 ~clear all
( {/ J: f* U" h" e) ]7 O- `clc* [  S9 D: c; Z* t! C

5 i! ]3 a" A/ H: g9 r: u这些命令清除工作区和命令窗口。
$ f7 B% H. [" Z9 ?+ [2 ]n = 8;
, U  i, e& U1 z; Schess = zeros(1, n);% f7 ]9 H+ }2 Q% I
for i = 1:n
+ T( Z. D. Q8 l. ^8 Y# r    chess(i) = i;
5 i9 u  q  u  ]( S: Qend
) ~9 |8 D  C2 x5 b. g
7 @5 |! L2 U* _/ p% \' B* i. q这初始化了一个带有皇后的第一行的棋盘。1 q0 o# z" J9 t9 t( F5 T7 n5 o
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况, u1 \5 ?# z% Z( T& Q
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
* c* C; M' R6 K; H: Z6 f' ~2 M  Wnumber = 0;
1 [5 y$ [# ^3 O8 |[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
) C" b3 ]7 s* T. b* x8 e. j% K/ U4 t3 ~1 O
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。! Q+ _: r1 c# L8 d+ z
% P8 I* F: r6 q, w
" s/ O8 b8 g1 \8 N6 J2 {
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 09:14 , Processed in 0.387189 second(s), 51 queries .

回顶部