QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 16:28 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这是一个MATLAB实现的N皇后问题,这是一个经典的组合问题。其目标是在一个N×N的棋盘上放置N个皇后,使得它们之间互不攻击。提供的代码使用了递归回溯的方法来找到N皇后问题的所有解决方案。
  D6 p( d! W; z+ N$ ?1 ~; }让我们逐步解释这段代码:" g& S1 Y# W  \
function [chess, main, deputy, number] = justtry(i, n, chess, main, deputy, number)
9 d: j! w+ u4 s  @' M5 P3 o. S5 j7 J! O( O
这定义了一个名为justtry的函数,它接受六个参数:当前行数i,棋盘大小n,当前皇后的排列chess,主对角线和副对角线的状态(main和deputy),以及解的数量number。
: K1 `; P) ]* {7 pif i == 9
! M0 R7 {* K) b$ Q1 p    number = number + 1;
' G6 J3 K: v% ^- V" C    chess
" E! I) u; E; |. h( aelse" m0 M7 P. k. @
    for k = i:8
- b- i/ F1 d% ]        if main(i - chess(k) + n) == 0 && deputy(i + chess(k) - 1) == 0$ i4 h3 p: O2 a" `5 a! l
* w7 w2 L3 C- x7 Z/ |: {
这检查是否已经到达第9行。如果是这样,它会递增解的数量(number)并显示当前皇后在棋盘上的排列。否则,它进入一个从当前行(i)到8的循环。' b" n1 k0 s0 u- M" w
嵌套的if语句检查当前棋盘位置是否有效(即没有皇后互相威胁)。如果条件满足,它将继续放置皇后。
- j0 ^! E8 r* _8 E! y+ b            t = chess(k); % 交换位置3 \6 k) b% F; S9 {  [8 u6 a
            chess(k) = chess(i);
# O$ O& q* z- Y- e/ g& A( \            chess(i) = t;$ ], d7 M$ {1 j7 m' L

" v# [8 ~8 G/ s: l7 d7 l4 o0 ?  H            main(i - chess(k) + n) = 1;
9 }2 H( p/ f. X3 X, Q            deputy(i + chess(k) - 1) = 1;
  ^( I3 e" [3 k' Q) T8 B, x  T
% e! f' n4 N  N" }! K+ l            [chess, main, deputy, number] = justtry(i + 1, n, chess, main, deputy, number); % 递归调用
' i% P: y4 V# X$ H; w2 X- C, |+ @& z# ~. j! T" d4 P
            t = chess(k); % 回溯
( U" n# D' t( S2 C; P) R! w            chess(k) = chess(i);
- a7 W+ M( q3 j( y8 B            chess(i) = t;
" n; Z9 p' s4 ^6 E$ ^- k  P: R
" E$ k+ o/ F' r& ^$ ~5 E( M5 k            main(i - chess(k) + n) = 0;+ i) q4 C9 m, E
            deputy(i + chess(k) - 1) = 0;
$ h' I1 m" W7 C/ I+ n! y+ k  [) @" U6 e4 X) A4 q
这部分是回溯算法的核心。它交换皇后的位置,更新对角线的状态,对下一行进行递归调用,然后通过恢复原始状态进行回溯。
; O+ I0 M: l; ?: o* o        end) u& |5 j: V6 S/ a$ `+ T/ c
    end
) m6 T, |9 y3 [" J# Uend  N% o. y/ O& o; M$ T& _# J

, b  J% _" ~- B9 a! A. V这结束了循环和函数。如果i不是9,循环将继续到下一行。
% ^( }1 u; s# ]6 I5 F  oclear all. p# W9 L9 w: o  X
clc9 C; M3 c" A/ \3 [% L
! h3 Z! z: o$ e7 T  R
这些命令清除工作区和命令窗口。. M% e; h& E' A0 x, d
n = 8;, H" i5 L+ R5 \  t  a- q
chess = zeros(1, n);7 D% t& F, b2 P
for i = 1:n& D. `( l2 K/ \: Y5 }5 H* T2 `
    chess(i) = i;- [! I- \$ u0 N% ^
end% z9 R7 a- r0 C8 I
  T2 H; s4 w  W4 j7 h8 d' r" X8 r7 b
这初始化了一个带有皇后的第一行的棋盘。- C# R' Z& x& e* z0 L* ]2 L
main = zeros(1, 2 * n - 1); % 记录主对角线的使用情况1 `' E. r2 m- C7 w
deputy = zeros(1, 2 * n - 1); % 记录副对角线的使用情况
3 X7 r. u0 Z6 x. H0 q' \& Bnumber = 0;2 G, Q/ g. x0 n8 |
[chess, main, deputy, number] = justtry(1, n, chess, main, deputy, number);
% b% i/ j7 G* Z- @; T. o/ R6 R" J- o0 w! J% q" H
这初始化了数组以跟踪主对角线和副对角线的情况,并通过调用justtry开始了递归回溯。整个过程将探索在8x8棋盘上所有可能的皇后排列,并打印每个有效排列以及解的总数。
4 ?* j& t' ?: A1 f& |/ u  K* ]+ S
" ?9 H: D- M% o  {% L- U# N/ Q8 t: ~# i2 N9 h: V# w
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 05:24 , Processed in 0.365584 second(s), 51 queries .

回顶部