|
|
【零基础学Python】常用的Python 算法示例代码 p% ]/ q3 Y2 X' Y0 T
% O: ?! H- C& c. L+ L8 J
" l. u+ |* `1 a- [4 {( W& h9 J J; ~, n
Python 常见的算法可以分为多个类别,包括排序算法、搜索算法、图算法、动态规划、递归算法等。
% w6 b3 y. c+ \5 ?, E$ V. @( d
8 ~* I$ l% r5 z0 u) R5 Z/ L3 b一、排序算法
6 @# }+ R) P f* @" p9 i- H1.冒泡排序(Bubble Sort):: u* f0 |0 H U/ n, [/ T5 L3 C
原理:冒泡排序通过重复遍历待排序的列表,比较相邻的元素并交换它们的顺序。如果第一个元素比第二个大,就交换它们。这个过程会重复进行,直到没有交换发生,表示列表已经排序完成。
# { v; P$ s9 c) l! @" R- c1 i
5 T: N7 y0 ]- } Y- u( r( s时间复杂度:最坏和平均情况下是O(n²),最好情况下是O(n)。1 {5 I5 C6 L b. h# w+ `
9 f1 V/ j8 [$ k3 r3 d1 K实现: R4 b; ^8 l; N1 j+ v
' ~- J* G# d. s! I: j% p
# coding: utf-84 H4 ` k6 v5 W& _
def bubble_sort(arr):
2 g' @" d; |; U7 a8 E" d3 k9 ~ H( c n = len(arr)
/ u8 b1 }: [% j$ r6 m- H for nu in range(n):
( K4 R8 W0 M4 Z! [* C8 y; E swapped = False
( o3 t! [7 p8 g# y Q for nu2 in range(0,n-nu-1):: G& N& `( Y8 ~2 a. H
if arr[nu2] > arr[nu2+1]:
$ c$ x8 G) P- f! E- j1 X arr[nu2],arr[nu2+1] = arr[nu2+1],arr[nu2] #"""交换"""
3 @9 ?5 ^5 g6 ^0 a2 C$ v4 X swapped = True
' q4 P, @" I. T) k5 E if not swapped:
" g0 g- y1 g' P. l) ]" x break ##如果没有交换,提前结束
9 f. @ Q a2 Q2 b return arr
8 t m4 ~" O! r5 n9 S X0 u" \) T# S0 Y) }* y7 A* J: g( N8 u; u5 T
+ j8 i+ E$ q e0 P. T1 N+ h( Y4 j
3 S8 p" {4 o! B, n, [3 R
示例:
8 M" X4 f' L* `( u/ U6 L" fprint(bubble_sort([23,65,28,12,29,10,70]))结果:
. F# S" A9 y9 l+ {[10, 12, 23, 28, 29, 65, 70]
. N8 w4 W% O# e8 o1 T) a$ ^! l# U" D: p8 B# D
+ b7 E, Q, [. H/ ?
) T: o6 N2 D( {0 E9 b( {& ], N
# M( T( t8 W7 P% X) j4 x9 ^5 ~* R9 `: z1 ?/ ?5 w6 c2 k
( p7 M! H' R, b- |, O
2.选择排序(Selection Sort):& Y7 E6 \9 ~! Z( ]
原理:选择排序每次从未排序的部分中选择最小(或最大)元素,将其放到已排序部分的末尾。重复这个过程,直到所有元素都被排序。7 | O0 ~* r/ ?) |! P
0 s9 t: M) @) X! C" c& Q9 a- c$ q时间复杂度:O(n²)。: ~9 P) ?3 F+ b# G1 J$ |
! y" @3 ~" O1 `* I# Z6 [! t8 x实现:
6 l! Z' [: u, b/ B3 h" i" P- V#coding: utf-8
5 f# L& B% T6 z9 ^ L/ L: u- ]def select_sort(arr):4 w! _9 T. y# A/ @
number1 = len(arr)
! L. L3 }% Z$ Z& E7 H for nem1 in range(number1):
- n2 q) U h" W- f6 [2 D1 H min_idx = nem10 c3 w( g: X' y( J' [! C6 x7 L, D
for number2 in range(nem1+1,number1):1 J; m9 A! G) j7 C
if arr[number2] <arr[min_idx]:
0 q/ |: P5 f: @* J9 u* A min_idx = number2% }4 U3 D: E9 {
arr[nem1],arr[min_idx] = arr[min_idx],arr[nem1] ##交换
# I6 \1 [& z; P, lreturn arr
) ^4 }7 j. Y/ o H5 B) h( m
9 s; w# ~7 W1 y% {. Q + c M6 P3 X" Q; S
# 示例
4 y. `) E7 H8 `! n E" zprint(select_sort([23,19,90,11,29,22]))0 t, N) i- b+ l& T
结果:[11, 22, 19, 29, 23, 90]
6 ^: V4 U1 k# I: ?- u
3 M: C% [1 i" X5 Z/ _- G9 k. t9 p# D% H6 Z/ q' G0 A
3.快速排序(Quick Sort):
5 o" l8 _# B% K2 ^7 L5 x原理:快速排序通过选择一个“基准”元素,将数组分为两部分:小于基准的元素和大于基准的元素。然后递归地对这两部分进行排序。
1 P. \. v8 i( Y, v" M- V
' z5 S( C: H& s时间复杂度:平均情况是O(n log n),最坏情况是O(n²)(当选择的基准不理想时)。1 y) e/ y" a$ z5 S
) a/ N) s; X7 F7 t& Z" n实现:
2 ]( a4 K% I3 z% o, {# h2 y+ ]: e+ l
- G2 H0 Q% U7 b9 {def quick_sort(arr):' ]+ Z9 i$ Y: c2 l
if len(arr) <= 1:7 ]0 D+ M0 ^7 U% c3 b8 B7 y" r3 q
return arr
4 v, l, w( _! }& a, h1 a pivot = arr[len(arr) // 2] ##选择基数
( w- w5 q+ ^( }8 z- M- L1 ^8 L left = [a for a in arr if a < pivot]2 _/ l' W9 T, f# [$ L+ m
middle = [a for a in arr if a == pivot]. \6 J# D* d; _0 D# b
right = [a for a in arr if a > pivot]- i3 b ]8 \+ m! u
return quick_sort(left) + middle + quick_sort(right)
; t; z# r/ k+ G- a. l! N% j% e8 Z! h
9 W' g3 U: ]* O; q @5 M0 A0 ^+ C4 H+ ^3 H6 P! @0 _5 Q
# Y: y0 {% g; p- A/ ~# 示例( j" s$ h' [- F4 o/ |, ]1 U) p
print(quick_sort([2,5,7,11,1,3,1]))
y6 A8 w5 ?& O+ s! u T6 x% A4 v- ]9 N! H4 z5 G
结果:: [" }* A# f' K& z0 V
[1, 1, 2, 3, 6, 8, 10]9 M* M6 [. i% y
" W1 } O! _3 ~) L) @( {4.插入排序(Insertion Sort):; U7 q( J( w* d# A2 W* \3 T
原理:插入排序将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,插入到已排序部分的合适位置。 c4 v+ L p% @& [
' R7 `3 t9 p7 t. [8 O2 C+ w
时间复杂度:平均和最坏情况是O(n²),最好情况是O(n)。, {, C7 P2 G+ P1 _3 I
3 f- y' Z/ z) h8 D' y9 O实现:( K- D' k6 U) M, |
1 X* J/ F4 @ x* h! Cdef insertin_sort(arr):
: X8 v$ ]! ?4 z# s. G n = len(arr)! i# ]$ p) t* i" W) ^& P0 j$ X
for a in range(1,n):
2 j9 Q9 w0 t; J+ y1 @0 l4 G key = arr[a]
$ K8 v; _3 f# X b = a -1* i8 O: C5 a. M# `% n
while b>=0 and key < arr[b]:& M6 C6 T/ g9 p8 F% N% K+ S
arr[b+1] = arr[b] ##移动元素. C* p! Y/ {( z2 a& g
b -= 1
; S8 ?3 S9 y1 Z arr[b +1] = key ####插入值
# O9 J( p6 `, A/ B. Treturn arr) U5 b; L( @( o
$ e' W# ]1 \ g
2 F' F% `; N2 J# T# 示例; A" B8 |! o3 k0 ]
print(insertin_sort([11,9,14,4,7]))0 l( {; j# S" ]/ U# ^/ P4 A
print(insertin_sort([12, 11, 13, 5, 6]))$ P) s. @( K) S5 Z( j& T; c {; d6 i
# w- |$ I' i* F U" n1 B2 u) [$ w0 Q( @6 n( j/ }2 @% R
结果:
& o4 n7 `0 H2 e, c% U4 F
) O$ j! k- O6 G J1 ~) F[4, 7, 9, 11, 14]' \0 x5 N3 _$ J+ e3 s' S8 Y
[5, 6, 11, 12, 13]8 A7 O8 [! O; `/ B8 M6 c/ |, ~
6 X2 _' m' l4 W$ ^/ ]2 k. q8 Z6 B0 [ `/ W' @/ |1 v5 f
5. 归并排序(Merge Sort)
, C. A' B5 `4 b w8 @& d% z* ~原理:归并排序采用分治法,将数组分成两个子数组,分别对这两个子数组进行排序,然后将已排序的子数组合并成一个最终的排序数组。
1 w. \$ _8 m1 I: P0 |+ d0 B/ u; q e0 _8 ~
时间复杂度:O(n log n)。% b' r ?/ L6 W% C% c+ T4 \& v
2 i8 s2 J/ q) N( v/ \2 o* P实现:; T& J! a% D* @" ?2 j. d$ v" h: w
/ l$ O4 P6 c% L9 T) ~+ Y1 Y#归并排序
: r) X( \% W& `6 j0 W+ E7 Odef merge_sort(arr):; s4 a9 C9 Z5 `- p
#如果数组长度小于等于1,则直接返回
" R' Y# [# N- Z, j& l4 S4 f: ~if len(arr)<=1:' f' b4 O8 R8 [$ j9 n
return arr
: K8 X+ L9 e% D; Z" O, Z
6 z/ E. B- Y6 c' r s6 t ##找中间索引" Z: W4 o2 A( y6 U: ?6 w f% r. W
mid = len(arr)//2! ~' \0 _% R. }- O
& G8 z6 Q8 H# `3 ^+ G
# 递归地对左右子数组进行排序; @& X$ R8 F3 `& Q. J8 r" W
left = merge_sort(arr[:mid])" ~2 s* a# h/ @2 E- }( t
right = merge_sort(arr[mid:])
0 ^0 R9 A4 N0 ^
c9 m( b3 x( y6 s0 S #合并已排序的子数组$ Y2 y" \: ?. v. I' J6 X
return merage(left,right): n& U8 G2 R n
! j- Q6 h3 b, M$ Y& P& |& @& hdef merage(left,right):9 a" K! f: ~4 k0 Z3 B% `9 s$ T; [
sorted_array = []
$ B& V% M" i/ }+ o" K a = b = 0( }; b$ s# X1 l6 r9 A; k
##合并两个已排序的子数组
* ^2 p1 X0 Q( Z+ `3 F6 ywhile a < len(left) and b < len(right):
) r Z: Z- } e8 w' Q7 _$ u# ~2 Q if left[a]< right[b]:
3 i1 E; c3 j) B! Y6 M sorted_array.append(left[a])
4 P& p$ y6 M2 A7 N a += 1
5 A3 j; H4 H7 X7 J/ q. q1 k else:$ K% Y0 W1 |) ]2 o
sorted_array.append(right[b]). a- _8 f6 B- l6 A+ a
b += 1% u" B ~" I4 G1 R- o, Q
; }+ B/ {6 U) k4 g. ?( r
while a <len(left):
0 j3 c6 _6 g) B8 L sorted_array.append(left[a])
) v; h: d( [8 U; _ a += 1' O9 T5 X: m# H! O1 Q
while b<len(right):+ _& S: D5 ~5 F; m1 x! n& m5 n) f
sorted_array.append(right[b])( s ]; q. t7 t0 d
b += 1: @( b4 A/ H& w. S+ l1 p( ~
6 j9 m& [/ Q" ~8 G7 r
; s8 F8 z2 F' c2 W- z! M: ?1 Q return sorted_array+ ?# F& T" y, }& K" S# l# o
3 s8 }! G: o' n, W1 ^' f! L
if __name__ == "__main__":
' K5 s/ K3 K" d8 ] arr = [37,26,42,2,8,81,9]
9 i1 n4 A/ ^; @3 K a' Y) ^) j& v sorted_arr = merge_sort(arr)! q$ E+ U: T# q3 \
. L" n7 S% M- I5 w" U y- P
print("排序后的数组:",sorted_arr)1 O% ]6 f" S5 l4 u, z& {
( s6 {8 ^: f- K f+ `- ?5 x8 f
J O: `3 n4 t" {5 G9 J结果:
1 `- ]; H/ W0 ]$ K# b6 A+ q排序后的数组: [2, 8, 9, 26, 37, 42, 81]
& @) r4 C' Z4 w. ?! N$ K5 V7 B! `2 Y2 }+ j8 j
% |! ~$ E* \/ O% ~
二、搜索算法
7 r2 H& F: e1 ?" p$ u1. 线性搜索(Linear Search)
; e) A: Y9 |9 ], a/ V0 `( `$ x线性搜索是一种简单的搜索算法,它通过逐个检查每个元素来查找目标值。
! b6 s0 B/ B/ K) ^7 u3 M
$ o: E* w1 I+ a |
6 z. O9 k; X1 Z9 Kdef line_search(arr,target):
7 j8 ~( @) y) z7 s) c for index,value in enumerate(arr):
: F/ }' \# ^5 X3 F' V if value == target:3 C1 r6 Q: l+ [1 m7 ?
return index ###换回目标值的索引% Z) L: D9 j" z$ L+ S. f: m( ]
return -1 ###如果未找到值,则返回-1
" t/ J- ~; |: g* q( {2 [( C#示例) P+ p9 d' y0 A# h- F
arr = [2,5,1,6,9]
8 a, z* h% |# k$ _2 U' G3 s3 p* Ptarget = 94 H U1 L3 D$ y7 ]6 t4 [4 k. A% @$ M; h
result = line_search(arr,target)
% i& o" v d+ r3 p3 ~5 n4 Bprint(f"目标值 {target}的索引是:{result}")
/ p) w* Y) q( b# L2 d u' ]5 B; V# N1 o3 i
+ S: |8 k, V& V/ P! \# V' t5 W
结果:
1 \2 [. H, t, g. ~* h# L/ |( e* O: K( S1 q& g
目标值 9的索引是:4
& ?" A! [" y' x- F6 y0 F- c
5 ]; e% C: i9 j# C7 E) }& R8 F2. 二分搜索(Binary Search)
) K1 J; _/ T! @! j8 }( U- F, D( d二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过将搜索范围减半来快速定位目标值。9 E. H2 z* d1 D& Z1 {; [' q
# ]8 j" q& B( g
def binary_search(arr,target): f1 A4 v \5 g8 k& c* |
left,right=0,len(arr)-1
4 _. R' z9 y) l while left <= right:
2 o+ q& r. ?+ |$ s0 x% O! x mid = left + (right-left)//26 k3 G2 r `! n$ ^: y9 G Z: a9 B
if arr[mid]==target:3 s3 @+ q2 T% u2 t% }3 `6 z
return mid ###返回目标值的索引" ^( M4 |+ M# }1 Z9 Q+ B5 j/ @. w
elif arr[mid]<target:
. s+ i& B& M6 x k! a& Y8 g# Q8 v left = mid +14 N1 Z* ?- F- e$ e- O
else:
4 I: L9 ?8 i; t/ S% n$ c3 ?( v! M right = mid -1# B2 a' i: k2 J
return -1 ##如果未找到,返回-1
Z% k7 X2 o! N) d7 b/ M) a
' O/ J" {- l, D& ~2 O##示例
/ e A- z* f. _" f$ Uarr = [11,12,13,14,15,16,17,18,19]+ V# `* ? l7 Y4 K# d
target = 15
* ~2 ^+ F8 T) ~) J5 ?( ~result = binary_search(arr,target)
1 {% T+ H$ j5 pprint(f"目标值 {target}的索引是:{result}")/ x* P" S" u3 `) }( ~+ K0 x
/ l d% m9 J" L1 n0 C& N% z6 k结果:
) x) O8 K% {4 t9 k4 l1 @7 }目标值 15的索引是:4
8 K+ k* Y( T! H
$ @5 d+ ]7 D/ ]7 O3. 深度优先搜索(Depth-First Search, DFS)
& Z) s4 b0 N9 w深度优先搜索通常用于树或图的遍历。它会尽可能深地搜索树的分支。
4 ~; y* x' y; ^& E7 r, W# b" \/ d% j7 y6 v3 F7 {+ M
def dfs(graph, node, visited=None):% {; p& ]* X. y2 u0 g& A) k
if visited is None:
+ s4 X& t5 C% Q5 Y1 }" ]8 ^! G visited = set()/ L6 K0 D& X0 b
visited.add(node). H5 u6 c5 h$ U7 V5 ?; ]5 p' @
print(node)
, O8 S& m; ?9 F' q# O. [' l for neighbor in graph[node]:: t* |; i4 i- G) x. B$ i t9 C4 C
if neighbor not in visited:
; }0 b+ ^. {8 H7 R& _" H/ e dfs(graph, neighbor, visited)4 C$ ^1 |5 M! r3 K; v
1 d$ } o2 q" w4 R- O2 g3 U" ~/ G# 示例
5 P- [) {/ E$ xgraph = {) k& i5 {$ O! |7 o$ ]& L
'A': ['B', 'C'],! {' g0 i$ _, L
'B': ['D', 'E'],
1 ~+ B8 ^2 ~- R8 v3 T 'C': ['F'],
4 Y$ Y. B% e: w$ { 'D': [],* r( O9 s0 X+ I: W; r1 u Q
'E': ['F'],& {) N8 `" v, N4 W! a$ X& j
'F': []
+ l, w$ T5 C$ J" h9 \8 Z' X}/ e v) ^$ w; @- ^ k& ~
dfs(graph, 'A')
% T! w- J, J, s- {4. 广度优先搜索(Breadth-First Search, BFS)
* c* F2 I* v2 V1 M广度优先搜索也是用于树或图的遍历,它逐层访问节点。
! j [5 O4 w$ q: p
k! O4 I* c2 j5 D. r% I9 x0 ^from collections import deque
' ~# M/ P- s- D. b
) g( D' m( E7 _) ~' `8 G8 i( ?def bfs(graph, start):
4 A0 L! C7 {/ W6 q& ]' L visited = set()" O3 d7 H. i# b
queue = deque([start])
% e5 y* ~: g3 l2 p8 B1 ?2 K! M# C & P! h/ d; t# u5 E0 U N7 `4 d
while queue:
. l- V8 k/ A$ H node = queue.popleft()9 J$ N8 C. Y. _4 {( ?2 k
if node not in visited:# [ x$ D/ _/ }; v
visited.add(node)* X/ m8 u1 i. H' S9 m& |
print(node). W" S. k! \1 t; ?
queue.extend(neighbor for neighbor in graph[node] if neighbor not in visited)
& t) }( N$ j7 \, H' ?) B* d( X- [; c
3 o) y$ Z& g( _- b# 示例# Z i* {% G; q$ Z/ ^
graph = {, k2 c: ?) _8 A/ _ }% H, { C5 O
'A': ['B', 'C'],
5 O2 h" u( L2 @6 Y+ T 'B': ['D', 'E'],, z- x1 d( O4 E- X" Y2 A
'C': ['F'],+ G& j6 z; S# q. V0 Q
'D': [],1 D/ B* N$ I0 a1 a7 H5 X2 ~5 F
'E': ['F'],
! E/ E7 n+ L1 z6 V- } 'F': [], D; o9 w" t* ~$ z" o- j1 x# s( Z
}" U T1 |- C g/ u9 Q- R
bfs(graph, 'A')
9 S7 X5 V( r4 J三、动态规划
! \6 Z P; ]3 D斐波那契数列(Fibonacci Sequence):8 o O9 P, p0 \# r ?
def fibonacci(n):+ f- A! e9 {9 q9 y& C+ e
if n <= 1:
" r8 V7 m: R9 u; O return n. I, _, z( j1 m( D- x3 }
fib = [0, 1]
3 Q& {" Y8 u1 E r- h for i in range(2, n + 1):
- ?! a1 z7 }9 t! p% r8 f fib.append(fib[i - 1] + fib[i - 2])
: n3 ^5 k8 e5 \/ H return fib[n]
' _& Y& b: \8 b 7 B5 X w% d& ^$ `6 y& c5 T
# 示例
( n E3 K4 p! Z- Hprint(fibonacci(10)) # 输出: 55 D C7 W9 m; t1 z8 T5 p) E
四、 图算法
* }& Y, b$ A2 N5 C深度优先搜索(DFS):
. b( } q% K2 v1 I8 l
7 M4 X; F9 z! E6 M# j/ Jdef dfs(graph, start, visited=None):# c L* w- S5 _" M5 W! t
if visited is None:
2 X5 C: L1 P# G% Y. X visited = set()
: N9 }% |) F4 \1 h8 u- [4 g' G8 ^ visited.add(start)
! k; h5 U0 b1 _) ]8 M for neighbor in graph[start]:
# T, v# N! ]6 ~! o* k7 y if neighbor not in visited:5 X" D3 S" n2 q, }
dfs(graph, neighbor, visited)6 W) v* `5 y0 O$ a
return visited: ?( j) `2 K# p; ]' R6 b* k" {# n
1 ?" q! R( ^% m4 E) Z+ o: V4 f# 示例! s$ _# a: W9 S' i
graph = {7 y0 k" B8 o' M' L# E( [+ N
'A': ['B', 'C'],4 D1 ~' Z% e0 c# T
'B': ['A', 'D', 'E'],
$ j% Y0 C0 W$ l7 I 'C': ['A', 'F'],
8 q" q9 ^3 a% r' m* u1 G# R0 ]( u 'D': ['B'],* G9 C8 ]+ U' R) Y- m
'E': ['B', 'F'],
1 W C3 @7 g3 a) ` 'F': ['C', 'E']
( ]( [ X7 N: L" d$ g5 m# s' B}
/ T1 Z a, x/ y5 Z( N9 @print(dfs(graph, 'A')) # 输出: {'A', 'B', 'D', 'E', 'C', 'F'}
7 T+ s& v& Y+ Y% z G五、递归算法- }+ q+ V& R' e0 Z9 s A7 |
计算阶乘(Factorial)
9 b/ W" p& \; W4 Idef factorial(n):" T! z9 o, u3 a
if n == 0:
6 d; A% E, \8 O; D return 1) g# E+ i3 i i4 @
else:
! T( @; C2 b' Z/ f7 l return n * factorial(n - 1)- J% f* r/ }' X: `; F
6 v! d7 ?" a4 q/ t" n6 |
# 示例, I# e u& K7 v+ f w/ k( [
print(factorial(5)) # 输出: 120" R# g) s# F% y# N& H
六、 回溯算法
. o1 z! }7 |5 {9 V' R& H解决八皇后问题:2 H; r! T1 q6 M4 c
def solve_n_queens(n):
. v: M7 P! k; l- {2 ^ def is_safe(board, row, col):
- [9 y) R3 ?- i, v # 检查当前列是否安全
6 ?! O8 H- u, {6 s/ B% N( f" C for i in range(row):
. [0 z3 y- e& L6 c$ E if board == col or \# }8 l" s& v7 M! f4 k
board - i == col - row or \, I' r7 c. K/ D1 ~; N/ ~
board + i == col + row:/ x4 e& @/ @" s
return False
' u& e. j) _; l# [8 O' \$ @* X return True
4 ^3 _6 d" e% H2 @7 c . {% X4 L1 `' w
def solve(board, row):
- r8 w+ G# S1 J& S4 Z+ l if row == n:
! A& E3 h. V; u2 r result.append(board[:])
$ x& L+ r/ K. N" O4 m4 i9 ] return
# i: u/ f- A% C0 K: ] for col in range(n):% K# Q9 T/ Q9 s- D4 E
if is_safe(board, row, col):
3 {6 |/ h5 l4 ]9 X( h board[row] = col, r8 u+ X7 A- N9 G, r
solve(board, row + 1)
C, K* ]! M9 a7 f% A( y% }5 r # 在回溯时不需要重置,因为我们直接覆盖
- Q) k$ G# s$ N5 r8 Z( l; U4 K: X
5 D/ |! X5 q; D# n* j" f# w result = []
7 S7 }7 r# p$ M, l# `' s$ c board = [-1] * n # 初始化棋盘
9 |" [1 ` {% x# N7 E: P solve(board, 0)
+ `( {/ m+ \/ `$ j% e/ r* M return result
& T- x* ]( j6 @" @( L " T, M- P5 n, i5 U4 I
def print_solutions(solutions):
$ Z) G+ L6 X! x. ?) U$ R4 l for board in solutions:
* q2 N0 x2 |: P! r for row in board:
9 r, X1 c! I" d7 S' O. o line = ['.'] * len(board)
; B p3 m* _7 j, A7 l line[row] = 'Q'+ W; j2 c% x- C0 o( g. V. P/ u) v* {
print(' '.join(line))
& o3 _% Z) A0 a print()
9 O! k; Q+ u5 j, c8 ?4 }4 @! V: ` M3 J5 }7 y2 o$ h6 I1 R- [! e% b
if __name__ == "__main__":
. J, s2 {8 ^3 j* y/ e% H# U n = 8 # 八皇后
3 I, {( s8 [( F0 f8 L solutions = solve_n_queens(n)
; Q/ T2 W; m( C print(f"找到 {len(solutions)} 种解决方案:")
: {( i' {* J% I- \2 q print_solutions(solutions) [! E0 c% b; R7 P3 x- ~
AI写代码2 e! B2 K8 ?: N# W" f& l1 D
; ]9 a/ L7 d* e# Y
' V' J1 l$ P6 O: x3 L
& @ \+ ]6 J2 j2 x' [0 F' I f# [0 s
7 L% h! q% P1 C& m; q% o/ v5 e* O# R$ m- l, l. n
0 V0 ^/ m+ K& _' l" I3 }9 m# S* y7 I) T
. @; n) T% a8 u }: }3 {0 ]
( p( n3 t, z- O6 m! {
|
|