|
|
【零基础学Python】常用的Python 算法示例代码# N7 i. F( C# T7 o% m7 f) u; j/ E0 t
3 S$ h1 x7 L* j+ b7 g, V8 [3 M9 s/ n, T: H, D7 q
' \5 ]0 b2 a1 E! [& F
Python 常见的算法可以分为多个类别,包括排序算法、搜索算法、图算法、动态规划、递归算法等。
# O, {- _3 C# y/ a
# y" _3 @- y- H8 S. Z, g2 p2 d一、排序算法
4 Q3 U( F6 l6 N7 Z$ V. k1.冒泡排序(Bubble Sort):
+ I7 J5 l3 c+ W( @8 p8 |" \原理:冒泡排序通过重复遍历待排序的列表,比较相邻的元素并交换它们的顺序。如果第一个元素比第二个大,就交换它们。这个过程会重复进行,直到没有交换发生,表示列表已经排序完成。
* C: {6 N; I% i+ P3 Q
3 U, ~2 M8 k# o8 o( K5 B时间复杂度:最坏和平均情况下是O(n²),最好情况下是O(n)。1 x0 \( |; s6 I* w# L: T
( k* I' T" O- [ f' b' h实现:
9 U' m E8 ^# \# [$ Y% y9 }: A1 V4 s, g# M) [- E
# coding: utf-87 o% y% M' ?4 g3 g
def bubble_sort(arr):
$ c* R2 I/ C' |' n3 w% H) N" q5 |7 b u9 t n = len(arr)
) s7 t7 M( ^% M# G y/ q4 ~, o for nu in range(n):
( ~4 M& A$ b A: l swapped = False
/ V2 t2 h# f4 G% b- f for nu2 in range(0,n-nu-1):! h: K! \# ^. d! y5 V
if arr[nu2] > arr[nu2+1]:" w3 e4 W% D+ J8 A6 j( y* Y7 @$ B
arr[nu2],arr[nu2+1] = arr[nu2+1],arr[nu2] #"""交换"""
$ a7 k1 ^3 d) H9 I7 } swapped = True
1 J% J, F9 h% {7 D" S4 U: u. D if not swapped:, t6 j: c r6 J' n, {$ | q. C
break ##如果没有交换,提前结束' q- h7 r5 _8 Y& U
return arr+ l. N3 Y; j0 a/ C
1 @' H/ D& X) Z w1 X% `: c- }
: w! l( o& ]% X' u! B' {) z* M2 Y" }1 ?! B( B
示例:
' M5 e2 D$ H9 A! O y: Dprint(bubble_sort([23,65,28,12,29,10,70]))结果:4 c: B% Q1 N% ^* d/ _6 N5 B
[10, 12, 23, 28, 29, 65, 70]# F1 I, v# i! ]
7 j$ Z; h& w. n6 a) J5 p) B p! i7 R! }9 ^* g* V
C t1 s, W8 r9 }
3 d$ N: M4 y. _' f
; w7 g4 {7 k! [3 N/ i2 |$ A, \3 _1 q# l" j5 ?# o% D8 v
2.选择排序(Selection Sort):
2 ]$ Q7 |/ [' u原理:选择排序每次从未排序的部分中选择最小(或最大)元素,将其放到已排序部分的末尾。重复这个过程,直到所有元素都被排序。 K" W( e5 Y, e- T9 j% b/ Y
+ I2 S3 @) N* u, [$ }1 |$ @- F" @时间复杂度:O(n²)。$ e' z* n, \9 I3 ^' d: M: s
$ y6 ?$ C2 V* `# I
实现:5 L2 @% n1 Q3 p) v/ e
#coding: utf-88 p* U* X5 S) M- W I; A+ E; ?
def select_sort(arr):: y7 i6 ~7 J: B/ P' g
number1 = len(arr)
1 m6 j/ t, W9 c: p7 z for nem1 in range(number1):/ v$ H( z# A4 D4 q" q3 p
min_idx = nem1
5 _$ Z; g8 R: F0 h# n for number2 in range(nem1+1,number1):
1 e: i; C5 i8 j5 b2 _0 d3 k: w if arr[number2] <arr[min_idx]:* v; D7 \% U' O, s% v' |
min_idx = number2
: p" M' a \& N$ V3 `4 j) n arr[nem1],arr[min_idx] = arr[min_idx],arr[nem1] ##交换
- M0 f( n( ?4 n) l+ R) Z' y+ [2 \return arr
' V, T. X! O4 A0 }9 W
" d* l) }. P$ X8 l' V) W* L e& W; b( @: W4 O6 c t: i
# 示例6 s, p- k' y0 e/ f$ d
print(select_sort([23,19,90,11,29,22]))) {8 d: [8 l* L/ K9 v
结果:[11, 22, 19, 29, 23, 90]( A. |6 G/ e: E: ]. G7 h% _4 ~
+ E# T4 D# U# F; J
1 e' X9 k" {1 i8 }: [+ J3.快速排序(Quick Sort):
! F) P( p0 g; s X! A原理:快速排序通过选择一个“基准”元素,将数组分为两部分:小于基准的元素和大于基准的元素。然后递归地对这两部分进行排序。2 n- O' \ _. [- d+ n/ z
+ Y8 d0 c$ A/ I N( g时间复杂度:平均情况是O(n log n),最坏情况是O(n²)(当选择的基准不理想时)。" x7 W( ^& A* g0 `+ ^
) O$ v4 R5 }1 }. P7 f
实现:
9 p# u' z7 ?9 N* `4 b) y1 g) X3 g2 v: N. N* }
`2 N. F+ b% R9 N0 kdef quick_sort(arr):
# J4 [3 [; z' ? if len(arr) <= 1:4 a' w c( f' s4 m+ p% B/ a& z3 {5 Y
return arr
9 z: k! @' Z9 l$ X5 O4 D pivot = arr[len(arr) // 2] ##选择基数" Q- f1 g0 e: X8 R
left = [a for a in arr if a < pivot]
7 [- c& N2 M$ N" X* j% p. i middle = [a for a in arr if a == pivot]6 S* @9 u3 u T8 V2 n- p- y5 w) [4 M
right = [a for a in arr if a > pivot]& L1 ]4 N6 C( B! S) a
return quick_sort(left) + middle + quick_sort(right): w+ i5 ]4 |8 ~! E. k1 v# n$ H
, _: K- W; ]- C- V) C1 E" c: J
3 G" l8 a: M; ^& T. l
9 T# }" m& T/ p$ r4 j2 R# 示例
8 ^' Q. ?- V- D, \6 p2 q4 Lprint(quick_sort([2,5,7,11,1,3,1]))5 z% r& d% c. P7 T$ V' c4 q$ [! U
! o) o9 o" p; p& W" }
结果:
3 l& z S8 ~1 G, e" G[1, 1, 2, 3, 6, 8, 10]
L, `" _ b! _2 w7 e
( ^" c% l& l# ^) }& w j4.插入排序(Insertion Sort):
0 z% B0 @) c9 W原理:插入排序将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,插入到已排序部分的合适位置。- b1 }1 L4 [7 M, Y: p& N( U
" b0 O9 A3 y& x. L
时间复杂度:平均和最坏情况是O(n²),最好情况是O(n)。4 }+ c# }3 i- ]. X- k( L
% U& d6 A7 i+ z# o8 h d" E2 N
实现:
3 Q# }3 [6 D: V$ B! @: V0 }# @- V8 |) ?
def insertin_sort(arr):
3 x5 n' w+ Q9 d; ~ n = len(arr)
: ]/ J d, z6 C7 x! D for a in range(1,n):2 K2 D, @+ P; u( O: E( ~
key = arr[a]) d* E! E( Q( W$ i9 z
b = a -1
6 r) m7 P' U8 H/ ^) w& v! n; @5 v0 S while b>=0 and key < arr[b]:
8 R8 c/ J: _: n3 V# [1 b arr[b+1] = arr[b] ##移动元素; J$ h* d4 s" L% _1 _+ D3 y4 M
b -= 15 J- _. E' H6 w
arr[b +1] = key ####插入值" p3 I! r; A7 S+ e! ~$ d5 _* Z
return arr
& x& }! c; e3 `+ ~
; d: V* \! p1 U) u* {! g, |) {
( y4 l, ^/ f* [; Q H# 示例
6 o/ \0 R) z" M: d& K% l) `print(insertin_sort([11,9,14,4,7])). q+ l/ C5 ]1 A. z
print(insertin_sort([12, 11, 13, 5, 6]))
* f+ |: I5 t, u, D0 \
& q& I% Q& J# b' g3 Q# ?1 W6 S4 r: P7 z5 L& U
结果:
/ P! p! i& m2 Y% a8 ]1 s2 j& H
6 {% d6 t3 q% [: l) Q# D+ E[4, 7, 9, 11, 14]
' o$ {, h$ ? f* z! i[5, 6, 11, 12, 13]
+ P: f& l6 N% ~+ A6 T. y
- f# W0 z( Q2 o
, n" M" ?7 M) }5. 归并排序(Merge Sort)
: d4 h- L) [. D! V; Q( ?原理:归并排序采用分治法,将数组分成两个子数组,分别对这两个子数组进行排序,然后将已排序的子数组合并成一个最终的排序数组。
3 Q" d5 h- Y- D5 A7 w; R/ V: i2 Y0 G7 ^0 k' ?& n3 y) H
时间复杂度:O(n log n)。
i0 K! g( V% X s
/ t( W, g" w9 ~( S实现:% q- W# ^: u9 B- `
; m& c( v2 I# t+ C; E$ x. w#归并排序
7 y' a2 c) D9 w: a, N2 }8 odef merge_sort(arr):
+ x5 u: ] L8 Z& D% K #如果数组长度小于等于1,则直接返回
4 t% \1 ~1 E- _# {( bif len(arr)<=1:
, o" r! E# o- o) T# ?+ l& r3 E return arr2 R, C7 z7 P! J0 P4 ^8 a
6 t! p) H; d7 O6 X8 i, U; b
##找中间索引
7 C P6 J: t, |mid = len(arr)//21 B O( p/ w9 X4 j& _
% \6 K: y X9 b) U3 c5 F6 \. Y # 递归地对左右子数组进行排序
1 g/ }% C) ]1 Vleft = merge_sort(arr[:mid])
7 R* C/ B! O8 V. F right = merge_sort(arr[mid:])6 ~- }* G* ~2 h* {( G1 t
' Q+ i' A5 |2 u7 L #合并已排序的子数组. F0 S* q5 \( @# g/ O
return merage(left,right). k1 p8 F+ N, R' d
- y M8 Z* |6 H- D8 B+ x/ K% C4 J3 Vdef merage(left,right):: [3 d! G- d( T; d3 o& |& K; {
sorted_array = []
0 p9 C6 z8 F1 D. v4 z+ e: i- h a = b = 0
+ m$ L2 x( S+ x- V ##合并两个已排序的子数组
( L; c, t, e& w* a$ K( twhile a < len(left) and b < len(right):" `. E* t7 e. a: ?6 T) ?) a
if left[a]< right[b]:! I& y" f# |/ K& w# Q; A
sorted_array.append(left[a])
3 h* s% V# W, }9 @! N6 x# |3 E a += 1
! t: l* E8 a# H5 _9 ^* K! c else:$ R; q+ n: u( r: C* g4 G) `
sorted_array.append(right[b])
7 f; v Q8 K& a! N b += 18 J, K5 d$ T" C% Q0 @
. F8 |2 G _ p' a- b' A! I+ ~
while a <len(left):
3 a6 v% q8 ^( p6 D! {. N sorted_array.append(left[a])
5 t. N& r: ]% z( N4 H5 Z+ u a += 1# d& p6 z0 t0 Z, [) W! e
while b<len(right):
9 L" a, V) t" u/ ]5 y9 r) B+ h sorted_array.append(right[b])
7 d$ {! `( y" T% s' d1 q$ [% [ b += 1
4 j! u; u1 h* E0 c# A' b n/ x
# i+ K7 @2 m9 @* ]- f6 [
: n0 C' x: f/ }+ H4 E. b& ~ I return sorted_array$ l: w1 W4 r! K2 [) P
5 K5 H9 p* R' ~: x
if __name__ == "__main__":
1 x# |& ]0 Y3 V$ S: _ arr = [37,26,42,2,8,81,9]
, v1 ~! X9 s+ G( k sorted_arr = merge_sort(arr)
" t% M$ `* N3 ~( N; c& Z1 U; T& `8 {8 {4 y. ^& P. W! C- f+ B
print("排序后的数组:",sorted_arr)
1 _ Y% g& @! S/ X; ~0 l+ O
1 I" z# H2 X0 z( E& W
' n4 f; t3 r6 I$ M; h结果:+ R/ ~5 m: Q4 M- \0 I7 v
排序后的数组: [2, 8, 9, 26, 37, 42, 81]
: ?' @) P: R) c' ~) L4 E, x' w+ w, d" Z
. H; p$ a4 l2 r. ~2 @二、搜索算法" h* d+ e! ~4 z* P$ E$ _1 c
1. 线性搜索(Linear Search): x& A/ O2 x) E8 V1 f' J
线性搜索是一种简单的搜索算法,它通过逐个检查每个元素来查找目标值。
3 x, K- a. w, d2 Y
* s5 z& A! C0 [# P! v1 O/ r! f! a7 ^; y5 @2 v6 D+ s
def line_search(arr,target):
& r# `& _; K, G W for index,value in enumerate(arr):; h6 x1 T2 i( N! b1 T& U$ s; _
if value == target:) h* Z2 U! t1 h9 `
return index ###换回目标值的索引
7 b, S- O. c+ u7 Treturn -1 ###如果未找到值,则返回-13 J! ^# h* q4 }. j
#示例8 p1 y% G, _% n t% s4 I; N
arr = [2,5,1,6,9]
' j; g4 [) r* B- ]* s; M5 Qtarget = 92 Q4 T w% j) Q% a: n9 o
result = line_search(arr,target)0 B: y) [4 f N B; T# t" p% E( g
print(f"目标值 {target}的索引是:{result}")
; j, o' g) z" x9 k
+ _; ?- `* F3 u5 t2 D3 S
! l; ?& x) I% R- t( M! V结果:
$ @4 l/ n8 h. U. c ~+ t$ M( S
% g1 M- j) s) ~% @2 n4 h目标值 9的索引是:4 {2 ^% i2 \) }% t! u! c
' b5 u0 s& C) t2. 二分搜索(Binary Search)
( \6 q7 c8 Q4 W A二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过将搜索范围减半来快速定位目标值。* _7 ]- Q6 G6 N+ d2 {
, @1 a$ d0 t- h D% x$ V
def binary_search(arr,target):
) ?5 B+ C6 T) Q( p left,right=0,len(arr)-1
4 b7 \0 |; ?: @" @; k1 r- I# E9 W while left <= right:
4 N$ U2 B, s( J mid = left + (right-left)//2
5 K7 r3 Q" a/ l6 E( D% d' M! Y if arr[mid]==target:1 D. B }1 O- g, q4 \5 @: i8 Y
return mid ###返回目标值的索引. g9 `+ l! z) |7 z D; l
elif arr[mid]<target:
; ~* g/ a5 t* j4 L: I4 U! L left = mid +1; P2 Y' s6 G& B3 C. n6 X
else:' H+ l1 }2 K! T2 x
right = mid -1
" [8 F; J7 \3 Z: M4 J+ e+ p return -1 ##如果未找到,返回-1
; ` y# y' V5 P6 p- A
6 T) S( j% }$ L9 Q##示例
) C' i% b8 \9 s, O# j/ N9 F& h$ xarr = [11,12,13,14,15,16,17,18,19]/ I5 U8 J# Y4 q8 p- X, r
target = 15
8 m+ f1 M7 Y( r1 i1 kresult = binary_search(arr,target)
- B6 b Q3 Q4 x. P& K* e# u& pprint(f"目标值 {target}的索引是:{result}")
8 N" Z* _4 ~) q4 v8 a' ~! U
; f* z( p% S9 C. V结果:( \: ? H; q2 {1 f g0 C$ r
目标值 15的索引是:4/ Q; W; x5 o+ ]: R! u
& {& L9 Q; i6 C) [3. 深度优先搜索(Depth-First Search, DFS)) }7 ~$ }* ^- T2 P
深度优先搜索通常用于树或图的遍历。它会尽可能深地搜索树的分支。
, r9 e( W- |1 Y0 f+ l2 s8 _: s
$ S: q1 G0 ?3 V% T$ m6 r* R% Cdef dfs(graph, node, visited=None):( K k/ c& w, n- `2 r2 j, J
if visited is None:" u" p1 ^- b0 A8 h5 {
visited = set()8 q, ]1 L k4 ?* ?$ O2 v
visited.add(node)
: c \/ g2 X% o2 ^ print(node)
- Y" Y- \7 [4 {! e- C& \ for neighbor in graph[node]:, M+ B; C) t, V2 E
if neighbor not in visited: p# a) v1 d7 {# K8 `5 k z
dfs(graph, neighbor, visited), z) b' o, c3 D
$ l( |! ]( U, P* S# 示例
% R2 i) ? m2 m; b! W$ b- Hgraph = {2 {) {; ?* [. ~3 j+ L8 m# [
'A': ['B', 'C'],1 N( e, K- n) v% G
'B': ['D', 'E'],. Y6 t" c. F: X
'C': ['F'],
% f w- Y. Q: U. [ N3 v: C2 v4 p ~ 'D': [],
" k9 V8 g, } L3 p. {6 n6 } 'E': ['F'],5 `# `7 k! y) G/ [" }
'F': []
6 E& _" C3 e9 D( H( @0 W}
) h" O$ U$ T1 S# x9 X1 V z, c2 ?2 [dfs(graph, 'A')( N/ ?5 G# \" b
4. 广度优先搜索(Breadth-First Search, BFS)
' f( d! W3 T5 d4 u) ^; V广度优先搜索也是用于树或图的遍历,它逐层访问节点。
5 N W: d/ x; N' w5 `1 I" {
; Q/ a# E( [- Q, B# G8 wfrom collections import deque! O. h" C9 P% X( _0 j
' m6 s. w4 B4 w% P: n/ H
def bfs(graph, start):8 k5 G7 ^5 l2 J& Y g
visited = set()
+ \4 ~1 r0 i' S2 A! ]- Z queue = deque([start])' O4 E6 Q4 G6 h0 H% V* r
+ W# \( N! s" ?9 C
while queue:& c8 ^ E8 s3 i* |8 h. t
node = queue.popleft()! R; Z) p- Y; T7 u
if node not in visited:+ A( x9 H; b& u; R1 o; L2 G+ g+ ^
visited.add(node)
& y5 q P( X9 g8 c, J3 Z print(node); g3 e# ]" F& i: i$ @ k
queue.extend(neighbor for neighbor in graph[node] if neighbor not in visited)
$ G: R% `- b+ ?' i
r6 T) c( U a# f3 _9 h# 示例
1 Y5 F) o9 v6 E) F" s [' m, Lgraph = {
' n& Y9 F# z. u+ O" @& j/ E* z 'A': ['B', 'C'],% @2 G7 o# ^/ i) |
'B': ['D', 'E'],
- b1 x: A2 g8 D5 ^4 ?, d 'C': ['F'],$ s1 Q7 L% [% Q3 n- t
'D': [],8 W7 V( b4 O- Q
'E': ['F'],* x; n& e! e- A# N
'F': []
" g' T$ r3 J* H) w- S, ?+ F/ b$ _% v}
0 ]5 l. m" Q- X7 `! I9 S6 Tbfs(graph, 'A')
$ y5 R, q9 a! |三、动态规划
$ n! S/ T3 `: c0 G& X( W斐波那契数列(Fibonacci Sequence):
n" [: ~0 N4 i+ V/ Q1 idef fibonacci(n):: s1 u% O' n8 _, y; D5 o+ C
if n <= 1:
0 R. t# c" D" o- W1 o: ^$ K0 ^ return n Y9 T9 C. F3 O
fib = [0, 1]
, n3 g2 ~/ v' h4 X' E7 K; T- ? X for i in range(2, n + 1):
# L( A6 {7 q4 r7 O- x' i& j" L& T fib.append(fib[i - 1] + fib[i - 2])* |( C; e5 d! h& r; [; Q: L
return fib[n]- U7 W8 i6 R# {. F9 k
" m* f0 b' Z, x% D* x0 C# a6 k
# 示例8 J5 w) M2 G D. N5 w, t
print(fibonacci(10)) # 输出: 55: k+ ~# J& S0 b1 n
四、 图算法
* k4 g! ? K4 R' l" D v, k深度优先搜索(DFS):
1 V% l+ c: X6 G1 I
6 b" Z' B6 R+ l3 P0 `def dfs(graph, start, visited=None):. t, n7 }) U- Q( J, y0 T- S: v
if visited is None:
- J# w2 S7 d3 ], ?8 t) M" H visited = set()5 o2 B4 H2 h( D9 Y& |
visited.add(start)( ]# T1 T$ D0 l# f9 F( b
for neighbor in graph[start]:
: y- B; F# k/ ]% X$ q0 J9 u if neighbor not in visited:
, g b, G' b% q' o7 ^0 R p* @4 V dfs(graph, neighbor, visited)0 V9 a4 `4 A/ a' v6 {
return visited
. s. q0 G1 I( y8 ?5 k/ ]
( c: J& G8 J" A$ k# 示例
6 A! x# C# ^. ~9 J4 L. U' F" vgraph = {
/ k- ]0 m H2 ^- r) A 'A': ['B', 'C'],! ^1 ]9 [- e" e. \8 b o# `( J* Q
'B': ['A', 'D', 'E'],/ w j6 {2 u& J1 \+ f4 h; S9 G
'C': ['A', 'F'],7 Z$ S' L" b- u' q7 }
'D': ['B'],; G, j% K+ v% R5 M
'E': ['B', 'F'],
/ F) x T+ x; F4 f 'F': ['C', 'E']' `" j4 c& c9 G9 _2 X
}
2 F' u5 d3 h: \) Q6 z7 q" nprint(dfs(graph, 'A')) # 输出: {'A', 'B', 'D', 'E', 'C', 'F'}# ~( c: Q# a$ i0 ~. }
五、递归算法) h- Y: w( ~! V( u
计算阶乘(Factorial)- \1 ?' t5 i5 O( p0 r0 \2 N" `
def factorial(n):4 s3 N& P0 B; U8 v l' B. Q! w
if n == 0:
) m- d6 }; j/ r3 U2 N9 r; H return 11 ]. z1 b7 P e9 w$ {, a- |( S- u
else:
" D* j9 V/ X: D: r5 m5 p9 L) d return n * factorial(n - 1); E3 i* C0 z7 Q' [0 |* H/ V' B
2 m6 |' }( r% D8 p2 P
# 示例! ~0 f0 @9 @! ~ G
print(factorial(5)) # 输出: 120& m v! M% K a" R
六、 回溯算法! }# g9 _0 L* f5 e' n/ A
解决八皇后问题:
) F0 g) a9 v! Ndef solve_n_queens(n):
. {0 Q0 h1 t' B5 z& L, E def is_safe(board, row, col):: p9 K2 f, S9 G
# 检查当前列是否安全
3 Z1 b" c/ _. g+ l2 |( f; Q. j for i in range(row):
4 b/ T' b7 Y- [) W if board == col or \' p! p/ U; [" x* |; s. U9 O
board - i == col - row or \6 ~: b! X6 x& Q& i
board + i == col + row:: M1 H4 l1 U* L, I2 c `) p
return False+ z ]4 v+ X7 z# n. p9 I4 r( t
return True; M9 S |6 K/ \% A& j
( w+ ?8 h, G* X2 I! c+ m G6 ]7 N
def solve(board, row):
. A1 r/ k9 m$ t( a* S if row == n:
' o/ S# F0 k2 p- H4 l) B$ ] result.append(board[:])% v3 x: p0 N7 }$ D# j, f% |
return
8 U3 t/ _) M9 p& h" i2 } for col in range(n):4 U5 _5 \1 S/ _+ t9 d
if is_safe(board, row, col):3 ?1 o9 `* z& S5 ]7 E* ~( D W
board[row] = col
! h# X* B. k V8 Y: t' m0 T0 X* ^: Q solve(board, row + 1)
% m6 R/ j0 G' l8 q' [/ G # 在回溯时不需要重置,因为我们直接覆盖
( T& p0 x' A; V( G4 A& H: ?( P 9 a! C% }6 l( t- H% s$ \. }
result = []0 d" L# l- h+ O# F# A, Z4 C8 l' L
board = [-1] * n # 初始化棋盘5 s, U- ~ ]# [* u
solve(board, 0)
7 J* V1 H1 W- B3 F1 N return result6 f+ d* d# e7 m& K
( L0 C0 B9 L% w3 ~' A) n6 ?
def print_solutions(solutions):
$ U9 V) R) ^$ A7 H6 s2 R* m: [ for board in solutions:
# n: `; I7 f* R. X/ H8 n0 } for row in board:
0 P& E3 i2 i' W1 S* e, K8 ] line = ['.'] * len(board)
4 J6 C9 U$ z! C1 W# B- d$ D line[row] = 'Q'
0 M7 |" W! N1 I$ K' I print(' '.join(line))' W1 Q% X/ e Z6 x1 m! t5 A
print()9 p& t( C) l( ^6 R* F. y
$ v+ c- q, k6 mif __name__ == "__main__":: t' U+ v/ T3 p* j9 e
n = 8 # 八皇后
0 j# H2 x, |" I solutions = solve_n_queens(n)
* ?1 O3 n3 `* h; @% l" v print(f"找到 {len(solutions)} 种解决方案:")
6 U6 p: a0 Q8 n( m; j# J! J print_solutions(solutions)
. ~( [3 I9 y: W( QAI写代码
* G3 q' P1 H5 H* J" y! U$ q* ?7 p' s! X' z" H
& d y6 j: B' H9 g% \ s9 g- O
; X- F8 ]$ s: d& O
; Z8 e& v4 g9 Y+ x
" ]. Z6 n. w" G7 p# M" C E9 S* y
* D; @- y W3 Q) E! ^) h3 ~$ @1 ]( m( O/ d
' D& F9 I% U3 w. f7 Q. I
' |& Q$ X. ~6 w# } a, W! y% D |
|