|
|
【零基础学Python】常用的Python 算法示例代码# d. T9 e/ h9 R0 `& i, L
3 S ]7 ~" t! L O5 }7 i
" R* ^2 d* N2 w4 D7 {
" E0 S! e+ R4 gPython 常见的算法可以分为多个类别,包括排序算法、搜索算法、图算法、动态规划、递归算法等。
/ d8 u U' b& m/ E
\& q1 _) B/ D一、排序算法
# ^7 [. U. C, }5 T8 z' {* ~7 O1.冒泡排序(Bubble Sort):
( q4 |+ u% t$ V0 ]' b原理:冒泡排序通过重复遍历待排序的列表,比较相邻的元素并交换它们的顺序。如果第一个元素比第二个大,就交换它们。这个过程会重复进行,直到没有交换发生,表示列表已经排序完成。! X' o: g# m6 v! t
6 Q; q9 F) Z3 O( S
时间复杂度:最坏和平均情况下是O(n²),最好情况下是O(n)。) B, F1 a0 s* d) g8 \
) h R8 a# ]& |; O3 [实现:& D- C+ `0 A. H# c% u+ b
, {7 W4 E- Z, o% u# coding: utf-8
/ \4 S$ q6 K# r0 {6 cdef bubble_sort(arr):5 s: v7 u! V# m9 S5 ?9 |
n = len(arr)
" ^" C* S. @" k% q5 M( m+ g, y for nu in range(n):9 |4 y3 x: g4 I) d4 a3 G/ }9 M
swapped = False6 b" {/ \* _: K' A3 N
for nu2 in range(0,n-nu-1):
8 Q$ y! R( X3 {. o% L if arr[nu2] > arr[nu2+1]:
% X. ?. B8 B' H9 h) b6 @6 E7 o arr[nu2],arr[nu2+1] = arr[nu2+1],arr[nu2] #"""交换"""
* C; u. @% n' G1 Q1 I' H" }* z* l swapped = True' N# c0 W( Q$ Y7 e2 a0 {2 n0 G
if not swapped:2 g' J2 f P2 A
break ##如果没有交换,提前结束& P& J+ h4 ^; r/ g! r
return arr# P* u1 i) c6 M- v2 D$ f+ p3 }/ W
3 D6 r& T( ?- J4 M) q
8 E9 d/ H& J: d2 k
' \* f. p* Z0 J# |/ V: I
示例:
' F1 y9 t0 `" u+ [* a/ H! a0 |4 u' o0 ~print(bubble_sort([23,65,28,12,29,10,70]))结果:9 u& }8 a/ \: d4 e3 C4 i4 V: J/ \
[10, 12, 23, 28, 29, 65, 70]
; e( j2 s: M! `! d0 g& E( R
' K0 A4 `" [; j% A
# i7 X( A( j2 D( m) _" b% o6 j: t: ] q& J- y
# `- c4 ^+ b. S: A2 ?" q/ k! N
. R7 n' h6 F3 }+ V/ c- y P) y: J
2.选择排序(Selection Sort):
2 ?3 t1 P1 i1 C0 {/ K原理:选择排序每次从未排序的部分中选择最小(或最大)元素,将其放到已排序部分的末尾。重复这个过程,直到所有元素都被排序。" X, |! x+ X. ^' x7 [5 I2 C
9 @& `) [" b+ l& o9 M
时间复杂度:O(n²)。
3 N3 F2 q$ R: ]; P4 d& l8 n
3 k9 X" v7 \ ]9 a, S$ S# d实现:
9 g" D) C+ W3 p" ^#coding: utf-8
% H2 |( n" k: V3 A I2 adef select_sort(arr):, r* ?( L) C- P2 \: f9 X3 h
number1 = len(arr)
: `- E9 V- B: S9 P- J6 @ for nem1 in range(number1):
. X( z7 {& Q" j+ X7 |5 g+ ^/ S' E min_idx = nem1
" X0 [, L' o) k: B2 \4 b }8 y4 P( v for number2 in range(nem1+1,number1):
, \6 w& u6 Z( V if arr[number2] <arr[min_idx]:
$ m- k6 s$ N/ o; ~" N min_idx = number21 W1 X" O# G' |1 N
arr[nem1],arr[min_idx] = arr[min_idx],arr[nem1] ##交换
2 z) c- |7 s# T6 wreturn arr* b" d( @* s. x2 }% X
* N* A! Z9 |' R% w 8 H8 T: W& l3 ^2 O$ \
# 示例, l- e; V" c; L+ e1 D
print(select_sort([23,19,90,11,29,22]))/ `. N: E0 ?2 t5 T
结果:[11, 22, 19, 29, 23, 90]
) k* J% A+ Q# D8 ]4 u
* ?4 e9 h. ]1 G! t4 s/ _6 J1 F& Q9 [1 e) `; ]9 ^6 i+ `+ W
3.快速排序(Quick Sort):' u: b8 A/ T/ D+ |
原理:快速排序通过选择一个“基准”元素,将数组分为两部分:小于基准的元素和大于基准的元素。然后递归地对这两部分进行排序。. g G4 c1 j1 W/ d. M4 J* N3 x
$ u$ F) u+ i$ r5 C2 o3 s; }% c' `
时间复杂度:平均情况是O(n log n),最坏情况是O(n²)(当选择的基准不理想时)。& L1 F+ x7 x9 J
$ w1 o8 s& K: W$ e1 k
实现:' r; E% _/ A/ b$ b. }; G! ^
. E; s8 \2 b! E1 v& M) R4 S
0 g& b" U: r# x1 T) H
def quick_sort(arr):) A, m$ I# [ ]9 D" m, R+ ^3 F, D
if len(arr) <= 1:( v! N o2 h0 [6 F' X
return arr
# f. i. _& ?! R2 M pivot = arr[len(arr) // 2] ##选择基数$ x9 g& K4 k- T8 {8 N' j1 `: Y3 V
left = [a for a in arr if a < pivot]
; X; y) k* K, Y4 {. h2 f middle = [a for a in arr if a == pivot]
$ N3 |7 b+ ?4 p; G right = [a for a in arr if a > pivot]
+ O( C: v2 H" Z7 S+ @# U return quick_sort(left) + middle + quick_sort(right)
2 P0 B0 X: }8 }+ g' W0 `
8 ^7 ~8 A4 U* I( B \$ f2 G, v3 U3 b; f) g) e8 J
: F6 Q: E8 }# [! t# l$ ?% Q# 示例
& z7 e/ q* c$ gprint(quick_sort([2,5,7,11,1,3,1]))
/ W' n1 e5 O3 d8 @$ N0 Q0 `
( c; \$ ~; E4 m2 O结果:
$ h! K: u- _# z! b[1, 1, 2, 3, 6, 8, 10]
8 C/ h2 q& k6 k6 g$ \
6 U" \: a5 F6 _4.插入排序(Insertion Sort):
0 _0 b+ t7 e' t' |7 I5 C; K. X原理:插入排序将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,插入到已排序部分的合适位置。
2 d8 T6 G. u1 w: {) a9 ~
. l- Z( d! q* _: s1 i时间复杂度:平均和最坏情况是O(n²),最好情况是O(n)。
. b7 O- e8 J4 H: M8 q$ x4 f3 F
' `+ |5 p" {; X7 a实现:6 ]5 z/ I. t% A
5 b1 `- y4 `% J, l2 {$ Idef insertin_sort(arr):* R& p7 F/ ?. t% l" }
n = len(arr): O: ^+ s h6 m! |+ m. J. H. f5 ~: J
for a in range(1,n):
J; y. J$ f3 R X key = arr[a]
! C. v9 \% G" ^; u8 o' F- [3 r% a3 ~- t b = a -12 h. ^- z+ X* L
while b>=0 and key < arr[b]:7 I% {. }) g2 U) n* b$ O
arr[b+1] = arr[b] ##移动元素
; Y4 K% L$ u, Z8 L4 Y4 V# _+ \+ ?b -= 19 v$ B& l9 {' e" F. F4 q, _) _
arr[b +1] = key ####插入值
* G) l0 _. U$ S' I6 M( Xreturn arr5 c6 \* J3 z7 p0 c
6 N5 C' D' G9 F% ~8 F6 X2 q4 D0 r; Q9 J4 m( f/ J
# 示例1 g$ ]1 U9 D, `; V6 A" w# I% j% B
print(insertin_sort([11,9,14,4,7]))
9 V4 y8 [" ^3 X# uprint(insertin_sort([12, 11, 13, 5, 6]))
5 _; Z A" T' Z$ t0 S" { 3 z/ A) A6 z+ [0 u5 d/ P' X# o7 ~
- U `5 U3 A( d2 b y* X! [/ z结果:
1 h1 h9 r% j, k% ]0 @6 z1 L3 r) ~, R& I* e( q. }9 b
[4, 7, 9, 11, 14]/ ~3 _+ J" n2 G6 z
[5, 6, 11, 12, 13]
9 J; Z3 V/ o, K; f0 n0 Q7 f0 j; v: q6 O
, K8 b) N+ j8 F7 l o/ a5 d/ h
5. 归并排序(Merge Sort). z3 U3 M J+ Z9 f9 j S
原理:归并排序采用分治法,将数组分成两个子数组,分别对这两个子数组进行排序,然后将已排序的子数组合并成一个最终的排序数组。* m: S1 u: N, o9 \ t
/ V+ g6 Z) k4 } c) V' G
时间复杂度:O(n log n)。2 W ~6 u9 j6 q L, U+ L# x- P% e
9 [9 C7 {) S+ Z0 R+ B5 n实现:7 G8 ^8 \/ e- E0 X# | w! M5 G
3 v( S( z$ {. E7 c#归并排序 X+ S |* k" S. t
def merge_sort(arr):
' k' s; ?- r: r8 b: \3 X8 c+ A# d #如果数组长度小于等于1,则直接返回* F7 B1 [ \3 u8 p8 v* {
if len(arr)<=1:. G: P& H5 @5 d3 w. f( `
return arr. y6 s! V+ t% Q; k. j+ Y! h: F. v
% G7 {7 I I, `* p ##找中间索引
1 E q8 v3 l( Lmid = len(arr)//2
9 r4 _( n9 K5 [+ L/ b5 M& N8 N) G5 F" ]7 G* e6 B
# 递归地对左右子数组进行排序: }4 c g1 V# U8 U! w0 B
left = merge_sort(arr[:mid])
8 L% k5 [, G# Q5 Z8 G right = merge_sort(arr[mid:]). Y: Z0 P c8 h. u
( \6 `# a: c# v$ ?
#合并已排序的子数组2 L# b! F4 y& u/ e" q0 m! B+ s
return merage(left,right)
0 Q6 | Z1 Y# ]/ b; D( B8 d4 ~. A% q* O/ R# r
def merage(left,right):' w- V3 ]5 X0 l1 Y, E3 ?0 u# D
sorted_array = []% ]1 d% w1 w# B% V" l
a = b = 0, P; M# k$ f% b6 H
##合并两个已排序的子数组1 r2 F0 S4 i7 Z+ J
while a < len(left) and b < len(right):! H5 \. U! _0 @( Y# @
if left[a]< right[b]:
4 n! T& \5 i9 _* ?# M sorted_array.append(left[a])5 j. n" b& L/ g R
a += 1
$ T8 Q# K9 t# K: v else:
( }( Y9 P$ {. g- R* [% x. j sorted_array.append(right[b])# Q% e- W6 o) @7 c( @0 J
b += 10 ]9 r9 A" D$ {8 F9 D r
. E n0 C- F6 D8 Z. Z5 }
while a <len(left): E6 m4 a/ |/ @2 X
sorted_array.append(left[a])* ~2 x! W" x) S# x3 c. L
a += 1
" h+ t" P8 y. h6 v while b<len(right):
. s1 U6 H4 m5 P- L& k) ?% [; Q sorted_array.append(right[b])
5 O: T/ O3 m* W: a# Q b += 1
; `/ J8 ~( E' p* a4 x g8 Z7 j5 @3 j& T% G5 J" T) s$ k: k
2 H+ S: l& `& \/ `8 s return sorted_array
+ H6 ]1 f9 s" q$ z, C% {2 B. |/ d+ _/ b% j+ P4 F
if __name__ == "__main__":
" M( t, H. }% |4 f6 F6 \6 B7 x arr = [37,26,42,2,8,81,9]
7 J4 u1 V% B6 |5 p sorted_arr = merge_sort(arr)- O1 C& k8 O) k- M8 R% Y
/ y7 m7 x8 Y/ }) Q print("排序后的数组:",sorted_arr)
2 ~3 Z/ M) G+ S% s$ @3 g. M( V. I, X6 `
5 ^; k9 C4 }4 z5 [8 Z" U结果:
( c! E7 S6 H( x: }7 j/ d排序后的数组: [2, 8, 9, 26, 37, 42, 81]. r6 R3 I. ~4 u
" M; K' }, r o ]! j+ i# C# P% G4 ]7 P; ]2 }, E8 x* Z
二、搜索算法
8 I, Y7 c7 Z/ D, [8 t4 G( w1. 线性搜索(Linear Search)
/ u6 \% V# N8 G0 k7 A0 h5 R线性搜索是一种简单的搜索算法,它通过逐个检查每个元素来查找目标值。
# X9 r3 | n! z# G% t0 f0 h" ?4 a* N8 d& D; C8 ~& \
$ N: }5 F) q& V v
def line_search(arr,target):! Z/ s, A, _7 b2 y/ H
for index,value in enumerate(arr):' u& p) n# Y |. r4 x. l
if value == target:
/ q; N0 U( ~+ g% a return index ###换回目标值的索引9 P* y& H! h' S
return -1 ###如果未找到值,则返回-1
$ S) k2 T; y' K9 }' I#示例
# L$ f, Y1 b) oarr = [2,5,1,6,9]
* Q7 P) p) C8 K$ ltarget = 9
$ I2 E7 e- t5 e9 lresult = line_search(arr,target)
4 k* P& D# k) t, n2 T# ?+ |4 sprint(f"目标值 {target}的索引是:{result}")) x& R! D" J) ?/ e
3 }1 O2 m" ^9 P: n! W7 O
! H: q: h0 z- \/ F! u7 t' t结果:+ k& R* J- H" R% C1 X
& d, s2 E( v. P* a; L目标值 9的索引是:4
4 T' v0 v( Y, S0 y( s) a
6 g& E0 W( m! b( o2. 二分搜索(Binary Search)
5 J$ a' u4 S4 d, D6 f) A二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过将搜索范围减半来快速定位目标值。" `& w( D- x( ]2 A, N, [
5 G$ D" q9 u0 z# k5 M/ tdef binary_search(arr,target):
" h0 H* n) `" ^ left,right=0,len(arr)-1
/ P* }" J0 m- h# |+ E& k while left <= right:
' ]* O9 B% M1 ]' {* ~; g mid = left + (right-left)//2# B* o5 D" o, Q/ B* R- W9 P0 v
if arr[mid]==target:# c+ D; W& C6 k$ U I
return mid ###返回目标值的索引
8 L0 d7 k) T7 S$ Q U elif arr[mid]<target:4 q" w$ M; f3 @2 \# ?# m; m
left = mid +1" g J6 `0 M# m/ Z9 z
else:
6 B) H1 G4 X- X' j: `) V4 B right = mid -1
5 a! O* l, ]" G X return -1 ##如果未找到,返回-1$ ?# z5 P3 {! c7 m* w
0 y, C6 c5 W! d. \4 o- Z; H
##示例# B# P* F6 u, x; k1 t
arr = [11,12,13,14,15,16,17,18,19]
6 R0 P V5 M# L# f7 Utarget = 15
* G0 @2 R |! W% F, E6 e; Dresult = binary_search(arr,target)6 }) _' }- _0 r3 V
print(f"目标值 {target}的索引是:{result}")
$ ~' w% P) N* q* w! n& D" T, h$ _- l
& n" P- `( ^* i" V) t结果:$ w+ z1 ~1 p1 c: t0 y
目标值 15的索引是:4
1 _5 `* Y9 E4 P% P$ z( h! {& d: B! B! O& Z0 q; R3 J
3. 深度优先搜索(Depth-First Search, DFS)0 ?- B: k# U* Z
深度优先搜索通常用于树或图的遍历。它会尽可能深地搜索树的分支。
; M: E m, ^+ G+ T) Q/ ]
! E8 `5 t& ^+ E9 a7 ?3 z9 Adef dfs(graph, node, visited=None):
, Y) R$ B$ F: T3 d, d/ c9 H, j if visited is None:
/ e5 Q% M/ H: B9 x; R6 h* E visited = set()5 S" T; B; \8 O; w
visited.add(node); x8 X2 U1 m% \- `* M- ?
print(node)" F& a/ x& D* q% Z
for neighbor in graph[node]:4 z9 }' T! K; S! Y+ S0 I5 k6 C
if neighbor not in visited:! d( o6 p; O! o, ^
dfs(graph, neighbor, visited) e5 k+ p. a- u5 d5 a! a0 {4 J6 B
/ L; k1 A) j8 U: o, H: Q# 示例
+ m; p( m$ `2 s$ d7 _graph = {
, P0 A7 ~2 v; k/ d# F 'A': ['B', 'C'],- ~/ M* S! n0 {- p
'B': ['D', 'E'],
`- y4 F8 @! U" r( V0 x 'C': ['F'],) m* b& x3 o, f# E# q) }" I
'D': [],
& m2 N* I4 x8 V5 j( Q4 O9 v 'E': ['F'],5 E4 y# `1 e5 \% D- `
'F': []
2 U8 P; m! Y5 u}
. n: @' l8 k: s% X6 A& Ndfs(graph, 'A')8 [; S) X r% |/ u5 q/ o
4. 广度优先搜索(Breadth-First Search, BFS)# p+ |. N* t# p2 W# T
广度优先搜索也是用于树或图的遍历,它逐层访问节点。$ K5 s; {; F7 \8 e' G: H* l. O& t
+ y! h2 m+ z& L/ _* nfrom collections import deque
9 Q3 {/ V9 W9 z/ ? }
& J. ^' P( H" xdef bfs(graph, start):
- ]0 r5 @. u% w( Y% I' s visited = set()! `3 A' x t& d* @' _2 ~, x
queue = deque([start])6 R- q$ a7 D) i7 a: ]% T+ _* X
% d& R$ A5 }$ w+ J while queue:
7 c, e" J/ U9 F; k node = queue.popleft(); }( t b- @- A
if node not in visited:
8 j t F1 y' N) n9 b. P visited.add(node)
4 x+ R9 H1 O0 B) G1 F. f) K, v print(node)( @, p8 m! I* E. `% j& D* k- d
queue.extend(neighbor for neighbor in graph[node] if neighbor not in visited)
: j+ b: D( M- P$ u- \ $ k8 `" S( X, C, `8 {
# 示例
x) C! M6 y* f& j' [+ Ggraph = {
4 x& a4 o E* ?) n/ [8 N 'A': ['B', 'C'],
9 r; a! [( m2 {0 p d! K 'B': ['D', 'E'],
* K# y ]# K# d: j 'C': ['F'],
. S; X9 A& [8 y4 d/ b) I 'D': [],
# \& [0 U8 ]& q9 W 'E': ['F'],
& U+ q9 d: V6 ^1 F 'F': []& m2 ^9 {3 [0 \4 z! ?
}* \2 t' C& a% D7 @9 y' }2 f
bfs(graph, 'A')
8 q. Q& g- W/ X: h Y1 b3 G三、动态规划
: k, M% G* a7 E斐波那契数列(Fibonacci Sequence):
& }8 h9 ]7 I$ P! N Adef fibonacci(n):
' G$ s& c t1 H. }+ u _4 ~/ q8 p if n <= 1:- X* Q8 o( A6 b: h( k* z
return n
( w2 t, \6 z5 n! S' I$ }4 _& m fib = [0, 1]
n; }, Z1 t0 o$ T$ f for i in range(2, n + 1):' Z* [8 n/ s5 C" Z S. U
fib.append(fib[i - 1] + fib[i - 2])
/ ]+ X1 Y/ t# }; Z return fib[n]1 }& F, L5 N2 N
- N9 |: K/ Z; K
# 示例/ ^) H" o: D% M5 r
print(fibonacci(10)) # 输出: 55' G T5 E) R7 d3 h
四、 图算法4 Q! d1 V m* H3 U1 k) v3 p( X; S
深度优先搜索(DFS):7 k. p6 o- O! _" j
/ h( s F# d) [* g- ^def dfs(graph, start, visited=None):
9 U7 e) z& d7 Q if visited is None:3 B4 l/ \3 U0 r6 B9 P8 j! E
visited = set()( L7 \4 I. R6 Q5 q
visited.add(start)' @, E% W& \( \3 ?5 K: U) E
for neighbor in graph[start]: K9 |% g( q [! Z
if neighbor not in visited:- A# e. c8 p) X# N& N
dfs(graph, neighbor, visited)
' A. O3 R \' W. ] return visited
5 ?' w s0 d% z2 T }% t 6 O# E. \' N* p0 J, |
# 示例/ [$ e1 z) i7 ^, G: V; s
graph = {
' x) x# P3 ?: }( o S 'A': ['B', 'C'],
_' `0 I& u" O- a 'B': ['A', 'D', 'E'],
0 _8 z X2 M1 l1 |- Y 'C': ['A', 'F'],
8 K: x: w: z0 w m: I 'D': ['B'],, F0 ?. g/ p( K3 ]" ~
'E': ['B', 'F'],
7 ^" E" \7 U- _ 'F': ['C', 'E']
) E. e) }& h) Z* Z: @}
0 f. J& r$ |% W- f, Z r5 u1 [print(dfs(graph, 'A')) # 输出: {'A', 'B', 'D', 'E', 'C', 'F'}
% f# z" P X# C, n! r五、递归算法
6 A3 q' S' P* x! H0 W" G0 J) f计算阶乘(Factorial)) M% l& j5 T& Z4 B) n3 t
def factorial(n):7 n# ^6 G( E2 _8 \
if n == 0:
% X% v4 D6 t# B W return 1
; C7 J" T( A) f% e! r else:6 u- p* I0 w1 M+ D8 r4 Z
return n * factorial(n - 1)
6 [% }! N6 x0 \3 M0 ?/ C
9 O5 i; l% Z6 f9 `5 M- P; j2 _# 示例4 I0 F7 Z1 T" P' o
print(factorial(5)) # 输出: 120/ Q0 V4 \2 t) W3 J% {
六、 回溯算法
" d; w, r0 j0 b: J解决八皇后问题:, D \' ], F+ }" t' C1 ]8 m
def solve_n_queens(n):
, h/ w P* }' g) t def is_safe(board, row, col):: P/ c! _* e: ^# J8 W
# 检查当前列是否安全
7 _! ~$ w6 w$ I for i in range(row):. m( X3 O; L5 l
if board == col or \
4 U2 p. \8 C1 |) h: Q2 R) } board - i == col - row or \% f4 q+ ?. t) l; E) J" e# F4 ^
board + i == col + row:
1 @! o: |/ H' y3 _; N ^+ E7 B1 D( L return False( U' N- U; \9 E' S- _1 X
return True
% X1 p. t, L% f0 y3 @! c0 k; A
% N5 b @: @! J7 w E1 y def solve(board, row):9 [3 u1 A3 R) I P
if row == n:
3 J9 w3 \& N$ B' S9 w4 b result.append(board[:])
: |' |- X* f7 q0 @ return; b, ^+ d( u! C& @1 b
for col in range(n):
# l4 @2 r6 X2 V7 D+ y5 a if is_safe(board, row, col):7 e- S- e9 _+ `$ A
board[row] = col
. U* y- E6 E' R! E solve(board, row + 1)6 D( t6 S. g1 ^
# 在回溯时不需要重置,因为我们直接覆盖% k# }; R! n* _. t
6 ~3 ~! p6 Q: ~" }
result = []1 _! H+ y1 j. P' |3 f# T# {
board = [-1] * n # 初始化棋盘& j, V, D$ t+ v1 U$ O+ y/ s
solve(board, 0)
6 Z6 k) P* C3 {2 r A return result
|7 H" J5 a2 r3 I" z% {4 r4 s, s 2 n$ X" w: a% h' \* K
def print_solutions(solutions):
7 T& G7 [# a6 ]- t& \$ ]$ n for board in solutions:# {2 I' Q' ?$ R6 _; ^5 n b. C
for row in board:
0 M; }3 q* i. v9 a( \; J/ _ line = ['.'] * len(board)' S/ S) o9 T% [) g B* I
line[row] = 'Q'
5 Y! ?( _7 e- e# C. \ print(' '.join(line)); @" g0 x; I: p$ N) S
print()' [* |/ Y0 {8 q- |' u! M) E4 U0 V
1 A8 Z; g3 c' u: ]4 v' r; ^& }8 s1 aif __name__ == "__main__":
& c3 `- G( ~7 ^0 G" @' G7 o n = 8 # 八皇后( a3 K) z8 s6 x1 \/ @& F+ l# b
solutions = solve_n_queens(n)
2 z4 N3 S2 s: E# B5 _, a. r, Q- m print(f"找到 {len(solutions)} 种解决方案:")
$ i8 H9 ^; [* }; L) H; R7 k print_solutions(solutions)
' P, n* d( k5 E0 cAI写代码
. H! b2 x: v0 a' k
% H( G; @7 z0 E$ c3 Y$ M6 k+ q4 u9 b2 X! y9 P
7 f8 @6 D- @. |- \7 P' p
" m" V9 O( |& R1 k! S4 ]1 u
8 S5 y5 P. R: Z
, g2 n! \' V! Z! P" `# \8 M' C+ y( ?
0 e# O+ f! ?: G. e
! }' l# e' S5 q |
|