|
|
【零基础学Python】常用的Python 算法示例代码
% o- m# K/ `7 x* [3 {% F5 @6 _6 I6 v( H ^7 y: Z: v
, ^9 C; M. M0 _+ u) Q
2 d; C- j2 Y) b9 `& g
Python 常见的算法可以分为多个类别,包括排序算法、搜索算法、图算法、动态规划、递归算法等。
. S, V0 G, T% e# l$ t5 x5 `: s4 I) }% a, L2 B& K B4 m% _" _, J+ T
一、排序算法
; G. b2 S/ P8 d" j1.冒泡排序(Bubble Sort):
& M/ _/ N: X8 R* ~. F原理:冒泡排序通过重复遍历待排序的列表,比较相邻的元素并交换它们的顺序。如果第一个元素比第二个大,就交换它们。这个过程会重复进行,直到没有交换发生,表示列表已经排序完成。
2 D$ I0 O* j( {, ^7 L4 M n9 `. b6 E8 O, ?4 U
时间复杂度:最坏和平均情况下是O(n²),最好情况下是O(n)。
6 [9 g" A1 R* c3 r
& v% n0 N, Y" d实现:* N0 U4 ^" z. K7 G: H3 F8 }; k
" h/ d: [ r. D0 J# ^
# coding: utf-8; K% R1 M9 ~" m2 k$ @
def bubble_sort(arr):
2 D% }& Q: T$ d" W n = len(arr)
+ Z x: P: {# f( s8 c) Z w% u for nu in range(n):* Q' c' I! h1 s+ N/ H
swapped = False
! U' \% \1 `7 d. @6 _$ |9 | for nu2 in range(0,n-nu-1):" x; q4 y' b, S% K% @% n! J! x5 `
if arr[nu2] > arr[nu2+1]:2 U/ Y0 K# Q3 }; g
arr[nu2],arr[nu2+1] = arr[nu2+1],arr[nu2] #"""交换"""
# z2 G! \4 [( ]3 e. v swapped = True
& ^( \% l- x$ m- b" l if not swapped:
7 w1 Z7 w5 Z: |" \* C& B7 G break ##如果没有交换,提前结束1 k) D7 L8 t- K% s! i& W
return arr' t1 G3 m3 z9 g+ H" w
; Q1 j6 y9 {$ ^ ~" J% H5 c( W: O* h
e+ f8 [8 i1 Z7 Q7 i4 o示例:
2 w$ Y" r' t2 S' G8 lprint(bubble_sort([23,65,28,12,29,10,70]))结果:" b/ G: H+ `4 Q% P9 o0 @- ~+ z3 ]% C
[10, 12, 23, 28, 29, 65, 70]- V8 m8 L3 c& C% o3 q5 X; G
, t, }& D! h# h5 A/ V5 }$ P- u4 {( E) ~( J/ \% a) u7 g# Y
, Z& U3 f3 u! D
: Q& g/ b- X; i) G, g9 }: x) `! K1 X0 ~
. B1 |( s7 j, W2.选择排序(Selection Sort):1 w5 [, m* L1 `5 m6 u0 ~2 U
原理:选择排序每次从未排序的部分中选择最小(或最大)元素,将其放到已排序部分的末尾。重复这个过程,直到所有元素都被排序。- W- x" d0 p( ^5 ?6 W
# c/ S3 u6 S/ e. R时间复杂度:O(n²)。
/ s8 B: A5 d& ?6 b @6 v I! X R/ U% j+ Z/ [. x. Q
实现:
& J( d9 i( |" E: W) t, C9 s( [0 {#coding: utf-8
0 Y8 W$ {* B, W, P jdef select_sort(arr):0 b3 b1 P; I4 ]' u; J6 c
number1 = len(arr)
6 @# X( g& f% }4 g) O; b7 a3 z8 s for nem1 in range(number1):* `# l! w. V, U4 F' Y0 d- u) j
min_idx = nem14 c# F \& V; ^, h8 [/ I
for number2 in range(nem1+1,number1):
0 G( G% \ G% c7 B* t% H if arr[number2] <arr[min_idx]:" W4 D7 C0 M- k7 r G
min_idx = number2
- f' L- D6 r& f arr[nem1],arr[min_idx] = arr[min_idx],arr[nem1] ##交换
9 ^# {) j% K i( [/ Vreturn arr
, i6 G3 A; W/ r, i, l& q6 i2 D3 A5 h$ s. ~
4 Z. u) E2 c+ x7 N* ~# b# 示例/ L) S' Z3 h% M
print(select_sort([23,19,90,11,29,22])) f+ o1 i. i9 h
结果:[11, 22, 19, 29, 23, 90]; j. s( E* @- G, @" `
0 b. z) @+ W6 a% n0 A( _8 y* r6 r& q1 M$ x0 V
3.快速排序(Quick Sort):
) C* B3 s8 V6 g* |( m$ \原理:快速排序通过选择一个“基准”元素,将数组分为两部分:小于基准的元素和大于基准的元素。然后递归地对这两部分进行排序。6 f: S7 [( j# B! |6 [, _8 }
! C: C }4 P- t* D
时间复杂度:平均情况是O(n log n),最坏情况是O(n²)(当选择的基准不理想时)。4 t' g1 ?" N; A! o% h
+ n5 T# q8 |3 i4 S- V1 K
实现:
/ ~: u+ L c5 E$ G- u ^! `' r3 e! ^( a& z* Z
# @4 |7 P7 f. \9 r1 u# J5 Kdef quick_sort(arr):1 |1 }! |3 m! J8 Z# Z" P6 K# m' B; x% W
if len(arr) <= 1:
* e! }- A, \6 D6 u9 z5 N- ]* J) c return arr
2 ]- }6 p6 ~+ }( a8 d; `9 N pivot = arr[len(arr) // 2] ##选择基数
! }: `" a$ o/ Y+ E+ s1 R+ N( T left = [a for a in arr if a < pivot]0 e: B% J$ _( w6 C& L. {/ Q
middle = [a for a in arr if a == pivot]
2 z) v5 k2 M* g% B3 E5 J/ ?/ R right = [a for a in arr if a > pivot]( e+ B1 z2 I# u5 U. t
return quick_sort(left) + middle + quick_sort(right)3 M: ^ J; U) ^4 @# |3 Z5 i
: d) a- v" x1 l& F
8 ^ ` i6 f/ y( [, @; U, q9 t ' j3 z1 B$ E# `) K2 l
# 示例 @7 M' o! A4 d
print(quick_sort([2,5,7,11,1,3,1]))+ @9 }* z& v$ v, |/ B9 p, b2 J: e
0 M" [5 X( Q* R+ i8 h结果:
" b. j/ S% }8 K) q! s[1, 1, 2, 3, 6, 8, 10]. k2 D4 a9 n( r" N: b6 b' g
( v2 N+ o3 C8 o( ?8 E! f6 b, e4.插入排序(Insertion Sort):
! E' \* v& P& m ^9 ~* a/ Y: Q原理:插入排序将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,插入到已排序部分的合适位置。9 }, r$ C6 |& T- y0 d
3 T6 c7 ^2 `; i+ i3 e! q时间复杂度:平均和最坏情况是O(n²),最好情况是O(n)。
) R6 C1 I# `1 b3 u: u ~0 w; J0 X; i [ E1 {5 U. E8 n# ]- K
实现:# a' ^: g) U; j
{5 I/ f' H1 L: {& M( T4 `
def insertin_sort(arr):& r' D" W/ v) v$ D! [ z7 |
n = len(arr)
; d# u1 E, I4 T. Y) E# ]; s& R2 y0 z for a in range(1,n):
! t8 k( J" ^+ k key = arr[a]
/ {# _* V ~8 w! U1 d2 C b = a -1) S3 m" C! z. Y7 @, ~5 D6 v( Y
while b>=0 and key < arr[b]:& ?! j) r/ l" e
arr[b+1] = arr[b] ##移动元素5 \ s1 w* f; t) }
b -= 1
0 W5 I5 L( x5 S) @" `! W: d% f arr[b +1] = key ####插入值
" y7 p$ T, A6 v' O' Z. O% zreturn arr
# I! @& I7 p7 H+ ^( Y) {$ _$ @) E$ u1 W3 N% j8 `
5 L3 J* K7 G5 @3 w7 e# 示例# r! l6 G9 C, [' }. g m
print(insertin_sort([11,9,14,4,7]))
' L8 W1 J8 ^+ kprint(insertin_sort([12, 11, 13, 5, 6]))
* l8 h( i" b- K' n* k! k2 X
- a" |& b7 H8 ~+ `. y
; T% t/ T! e& X$ Q结果:8 d- o G0 c$ g$ P2 P' C0 S
$ w; L. {) F% |9 T W[4, 7, 9, 11, 14]
/ ^$ u2 J1 d" u1 x+ [[5, 6, 11, 12, 13]
5 Z9 M L$ p" Z: N
, |- O: T1 B) n: y6 e" V0 v& M/ ~: X2 V0 Y6 L8 N
5. 归并排序(Merge Sort)
" n. i/ P. ]* k' W7 G( [* N原理:归并排序采用分治法,将数组分成两个子数组,分别对这两个子数组进行排序,然后将已排序的子数组合并成一个最终的排序数组。
( @, x6 O( l% x& A4 \3 Z. O
: J* ?& f x* g4 _" {5 C时间复杂度:O(n log n)。8 }3 y; W6 O6 v8 \0 D1 r
6 j, B D: l2 U实现:
! T/ s5 ~/ t: _+ k1 G9 g% F8 b" y+ ]# `! K, M" R
#归并排序, s; l$ t$ s0 Z9 [3 Z! _7 |; A
def merge_sort(arr):
! s0 S, S$ [ E* F% U I #如果数组长度小于等于1,则直接返回
& V; J+ P+ b5 F; _7 lif len(arr)<=1:
4 C5 A- o, P, R1 c" l% i* v return arr
5 B* t" I) |, V% o8 C Y9 ~$ c, z5 \. V! ]1 o$ u& H6 {- J
##找中间索引" h5 I/ M9 H) j3 X& ^* A" M$ Y
mid = len(arr)//2& C' L3 X3 b. m8 w; t3 v Y
9 m9 R8 |& S* s. \0 g$ i
# 递归地对左右子数组进行排序
+ ~$ T. ?. S" c, b/ N4 dleft = merge_sort(arr[:mid])+ U' l( H) T) o3 N# u
right = merge_sort(arr[mid:])7 X6 J/ o$ [9 Y. |- H
3 o' w7 {% N/ h" P" n! c3 @3 ]
#合并已排序的子数组
$ T# U0 G( O3 Q6 h( a' m& ureturn merage(left,right)' |% l, T, m$ h' `& w
7 ]! S: H$ }; Y9 Z. sdef merage(left,right):
( }9 T6 O' O! ? sorted_array = []
! }) Y9 {! s/ j) e( a a = b = 0) u6 e) e3 q4 } h! ~ e
##合并两个已排序的子数组
% n+ ]4 [. J/ I/ V4 Owhile a < len(left) and b < len(right):, e' F7 y' G0 k$ Z" d/ G: ^; z
if left[a]< right[b]:% {; u% j; p! y; h0 r
sorted_array.append(left[a])
6 q6 F( A+ C. l1 O a += 1
( P- C! f" t' e2 U- F else:8 c$ r8 g3 M3 Q: H9 J5 j- O" L
sorted_array.append(right[b])
+ V) k/ T3 w/ S5 q) R b += 1' s5 q5 T, e+ O3 w y0 S+ n
( A% G) g' R& n" d2 W+ R, v2 H
while a <len(left):2 z. Q: N+ z' I8 s$ Y
sorted_array.append(left[a])1 e2 K+ Q8 t7 r/ e! M
a += 16 F6 a" i. u+ F; c* z: k
while b<len(right):: X) v8 g# U; ~* N7 P9 E; b
sorted_array.append(right[b])# m( K, c. r, d) V9 ?2 I# i
b += 17 H! r P9 e7 R
$ [' }9 H% @7 J; J2 ?5 F K6 Y
+ P" N+ G0 F7 q; a% r: o4 _; a1 C return sorted_array% I5 o# E) V7 |/ O6 ~: t
' i2 l+ c9 I3 e
if __name__ == "__main__":* w0 x* q+ \, j' A
arr = [37,26,42,2,8,81,9]
8 w5 ^% Q$ ~4 _ sorted_arr = merge_sort(arr)
3 d: ~3 T J& {/ n8 n' @6 H
5 Y+ Y, l* n, J) B print("排序后的数组:",sorted_arr)- X6 l/ O" y1 D8 u
M5 [+ b! Y) |5 i
% a' Q0 C& r5 Q4 Q: _结果:
! k+ c: u+ S3 r& I; `排序后的数组: [2, 8, 9, 26, 37, 42, 81]
7 v! a6 Q7 J8 `) C1 A7 O! O! S: `: a7 \6 ? n
7 D: H4 \. e2 u+ x9 F9 a, S% |
二、搜索算法
. }5 d: w0 }, t2 B1. 线性搜索(Linear Search)
% U# n) _8 m/ A* I" x* `$ _7 n' ^线性搜索是一种简单的搜索算法,它通过逐个检查每个元素来查找目标值。
) l- M3 e$ C! l' m" m: H$ F
0 w4 I1 J$ W' c# a, {2 M; V" n
def line_search(arr,target):8 e+ Y0 v1 B( x+ c/ z. K
for index,value in enumerate(arr):3 S) [; L1 I. I3 x2 D
if value == target:
) e, ]6 ]0 y9 K$ k return index ###换回目标值的索引
2 P/ i9 B5 F# ]% t0 E/ yreturn -1 ###如果未找到值,则返回-17 b$ f! l/ C) k7 K. l7 M
#示例0 e `7 \' `5 y9 u1 E
arr = [2,5,1,6,9]/ L" X) M$ O4 }$ n
target = 95 ]2 H F8 O, D) L
result = line_search(arr,target)# P' f" B1 _' U+ ?6 P
print(f"目标值 {target}的索引是:{result}")
: t5 l/ t6 B2 |% T( j4 Y7 Z. X! b" A/ `8 _: S
( q0 @! M% `/ o- B
结果:- I( V2 }- U7 y; f4 W, m/ w
8 x, k# i& Q; T/ S; R- A
目标值 9的索引是:48 A3 \: {7 W7 o% T
( |- M$ ?1 P; P/ Y/ g
2. 二分搜索(Binary Search)! l0 d3 ^) r6 [( d# D: f
二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过将搜索范围减半来快速定位目标值。
- z- |+ C5 l* U: z6 C7 p
- N( ]; F+ S" a8 pdef binary_search(arr,target):: m: H5 S- N' n" b+ d* }& P
left,right=0,len(arr)-1: f! i# c, r4 n
while left <= right:5 P- _# ~0 X3 \$ T
mid = left + (right-left)//2
' u. W& @$ I- V, I" Z( c' B. K if arr[mid]==target:
H' n1 Y. n7 U" C2 C return mid ###返回目标值的索引
+ a3 j1 T, a/ b- V- P3 c elif arr[mid]<target:
& `3 ^ [/ S5 j left = mid +1+ k" |" v, [6 y. v N
else:
7 K* N- j O; d1 @8 q3 S" | right = mid -1
& m; W/ u, o7 O4 {9 _* |3 \ return -1 ##如果未找到,返回-1( }' A6 r8 Z6 i6 h
' Z+ j2 j, G- y. W8 S& V& S$ _##示例2 @- t2 m) L7 O( ?# g5 q7 N5 ^; X. J* m
arr = [11,12,13,14,15,16,17,18,19]; h- c1 }' E% F+ B# K7 A
target = 158 E- P4 x4 s* l. o+ u0 W* k% ^
result = binary_search(arr,target)
/ I' t( n4 |0 zprint(f"目标值 {target}的索引是:{result}")6 o3 ~6 a1 m' H* Q9 ]5 w
, T5 S2 W) z8 V! ^' v: }
结果:+ q0 P7 y K" k ^$ h8 W; j5 ~' |; s
目标值 15的索引是:4
& C" J3 h0 ]+ T: D9 V% F7 G6 t9 @7 ^
3. 深度优先搜索(Depth-First Search, DFS)- p0 n' S4 e! B
深度优先搜索通常用于树或图的遍历。它会尽可能深地搜索树的分支。
- f' `9 v$ e3 v: h" g& ?1 g) P; ~4 c& z4 x# U) |
def dfs(graph, node, visited=None):/ j O2 l$ j+ ~% q
if visited is None:; F+ n5 W% ~, o# e5 M* w& K
visited = set()' d( e2 g8 y/ D/ f1 d% ~5 N4 V9 X
visited.add(node)
- `6 O# u/ \; ^, N& L' ~3 j print(node)4 Q! Z5 a* o4 [7 ^+ P4 f
for neighbor in graph[node]:/ M7 e$ ~% S% S9 O1 L
if neighbor not in visited:, s( ?# [) f5 E5 K$ [! H
dfs(graph, neighbor, visited)
6 h2 ]: E7 B: w5 O# w0 p3 y + `( o/ ?) _% {' c; F1 _
# 示例
' [0 {6 T$ A: ~. P$ C- Q, K( cgraph = {: S' v1 G0 d/ `. X. N
'A': ['B', 'C'],4 G' K7 p. t2 v. p4 L1 d. J. z5 P$ `
'B': ['D', 'E'],
- t. K( b# ?( n: O2 W- v, h: P 'C': ['F'],; C* x& W* K& c7 M# Z+ v9 k+ j5 t
'D': [],
: N# }) o& g& w4 { 'E': ['F'],+ C$ q% N3 \* v+ p7 u, x
'F': []
. R' F( q# @' u% n' F1 C5 P}
% D! t. _) }6 Q$ Xdfs(graph, 'A')
% G) M- g( T o+ y7 G4. 广度优先搜索(Breadth-First Search, BFS)
c, z+ M' Z! x& I2 u$ Y广度优先搜索也是用于树或图的遍历,它逐层访问节点。
" Y3 I0 [: Z, {7 W& x7 M8 h# b8 {* j
from collections import deque
* L1 E7 S, B9 j- \. G
: }) {& J7 |/ U s+ s7 h6 I/ p" ddef bfs(graph, start):7 J! B1 c7 ^! N9 H: k6 v
visited = set(); f* z2 H! q- A) w
queue = deque([start])) ?# R3 j. C! K. y. r t' V
" T4 u$ E% @5 z9 c& l while queue:
& [! Z- v' B4 B4 ~) } node = queue.popleft()
7 E, ]) F) Q, h( g if node not in visited: ~4 D) c8 ^5 F5 X4 `* o
visited.add(node)
$ o4 Y+ q5 Q& M* l3 ~ print(node)
. _0 N: {# d5 z. F6 F queue.extend(neighbor for neighbor in graph[node] if neighbor not in visited)
5 Q5 H4 O) Z! r+ E ! f' |/ l0 `" ]+ Z- q$ L+ B
# 示例
% T& i# |8 u, a, `! H' y, Ograph = {: s$ C( V" p0 E8 K; _
'A': ['B', 'C'],6 q# \& _+ }' z8 R3 y
'B': ['D', 'E'],
* l0 h3 c8 R. w2 ]4 F4 O* a 'C': ['F'],6 X' ^ \+ Z' H' k$ b& s
'D': [],% H, M# M& C* r
'E': ['F'],
; W2 B+ H* A4 D3 C. ?( x5 h* w 'F': []
5 c! {1 L/ B% F4 T}9 |5 x- e1 t& h! q9 o2 x# s
bfs(graph, 'A')
: N5 P/ |6 i! i, ]三、动态规划0 F7 `# C( v# Z" J4 w$ k7 c8 ^
斐波那契数列(Fibonacci Sequence):5 q" d5 w- L5 H9 g ], i; j
def fibonacci(n):2 {, P3 P% Q$ l5 O9 w, T
if n <= 1:; h' r! C( c' a+ H. o
return n2 W- {: p( [. U4 U7 p
fib = [0, 1]# k% A5 ^: ^4 R, Q/ B
for i in range(2, n + 1):
5 ~+ L" T1 W1 P" K6 o0 [ fib.append(fib[i - 1] + fib[i - 2])4 F1 f* H$ A U
return fib[n]; Y8 H$ I5 n2 j( c5 S
; v% y0 i$ _ A* X' ?1 m. g
# 示例
; D) _4 H' N. d Vprint(fibonacci(10)) # 输出: 55
/ G, O& f% h( @( x7 h' Q2 M/ [四、 图算法; e. l$ y. a9 z; g" P! N# b
深度优先搜索(DFS):7 s, U6 X9 S! M+ Q/ G( ?4 n/ h" w
* D9 q& _9 \) c8 d, D$ V) [
def dfs(graph, start, visited=None):, @/ k4 M3 e" w8 G8 O* h( p! _
if visited is None:
& S9 O& o: g4 k/ u4 S visited = set()# O9 O4 o& F' y* h
visited.add(start)- X5 _ n! f; h; b8 }' D- @
for neighbor in graph[start]:/ G: ]# R( V, r3 D; n. I
if neighbor not in visited:
, N4 }: ~7 n' s. v6 E dfs(graph, neighbor, visited)# `8 d# P$ E4 J0 L! F% B0 `
return visited, Y( u2 ^& E* C H$ S$ T. W
; I5 I: Q! A3 ], z# 示例
( `* j! I0 v8 k" z% f1 H3 Kgraph = {3 A+ q; d* Q2 [+ }/ ?) z
'A': ['B', 'C'],
5 B+ I" U# b9 K4 i9 E 'B': ['A', 'D', 'E'],) E, ], F- Q- k. C' u9 G' `# S! N' X7 Y
'C': ['A', 'F'],& b: M3 z3 {0 Z/ V; l. Z/ j( z
'D': ['B'],
8 b9 d! r/ d/ R$ u# a 'E': ['B', 'F'],7 f5 ~0 n5 v6 ^. h4 Z# H* \$ t
'F': ['C', 'E']0 N- }: w8 h9 T8 E+ C& z+ K
}1 f2 W& A( N. p. _3 O
print(dfs(graph, 'A')) # 输出: {'A', 'B', 'D', 'E', 'C', 'F'}. ]1 l% O! V9 q5 i9 f
五、递归算法
0 h4 U/ B/ z9 L8 H( i6 f计算阶乘(Factorial)
5 \: d7 P# ]2 D7 }; ?% }7 Tdef factorial(n):9 a& w6 I* k2 Z; u0 y3 |. C
if n == 0:
8 I& b# Z. m, \& P- l3 L return 1
5 G r6 `% k/ L else:
$ c; J' L' I6 J$ P6 E; N4 ?; p return n * factorial(n - 1)
4 t6 u8 Z" K% C# A0 Z3 z
7 x( A- o# z7 t% T* w, E$ y4 B& q# 示例
9 G) e* d/ K0 ^8 n: d( ]print(factorial(5)) # 输出: 120% `( ]# B2 Q2 \$ x; _0 k; I7 z7 J
六、 回溯算法
% W( I- i5 I1 y解决八皇后问题:' a( ]* H- x0 Y5 q3 b3 h5 d K* S
def solve_n_queens(n):+ u/ f6 O8 ?) K% ], E
def is_safe(board, row, col):
' n* ~. u/ \0 X: F4 n # 检查当前列是否安全
; ?1 I2 `/ u# K; h. Q- N+ r$ v for i in range(row):/ d* d! r! X0 P( g. R
if board == col or \$ ^7 l: M" q! U+ w7 w: R6 e
board - i == col - row or \
! B( F( l4 I. @8 O9 L, x) ? board + i == col + row:- Z' l( W0 l$ d% H% o/ t( r
return False L1 I) B/ m: x" U4 M9 T+ j5 V+ q
return True
$ J S( Q0 B8 k* c
2 t* I- u5 K% r# K+ O def solve(board, row):
* }6 z6 w% p) }, X' X if row == n:
+ F/ f9 x |. a+ o- l" _ result.append(board[:])3 N! G2 j) n D$ i1 {4 G
return
& Q! c, p) J3 V, I for col in range(n): Z5 @, |9 t+ w. `
if is_safe(board, row, col):
7 M1 Y6 @- N1 M! r board[row] = col
( T) V& u9 \6 ^% ] solve(board, row + 1)
; j' X* t! T) t" g/ O: b # 在回溯时不需要重置,因为我们直接覆盖
0 U, C( s% ~# x6 w1 X) K 0 M5 ]0 z" b! V( s2 t
result = []* k' K7 Z' N; k/ Q
board = [-1] * n # 初始化棋盘8 v( j: {1 S! k
solve(board, 0)7 t# l* K. ?1 Q6 N# N' E
return result. a7 N$ {% T9 o
$ G7 E9 P& F/ i* k
def print_solutions(solutions):
1 V% s3 i& F, h% o% q3 Q* G for board in solutions:
$ D2 M# u4 {' A7 G! Y6 A for row in board:
, h% y+ a2 z; d5 r1 z line = ['.'] * len(board)2 [& s) J3 Y2 f4 Y! N3 k
line[row] = 'Q'2 \8 p6 m& R/ J w; j; N
print(' '.join(line))1 N- {/ e8 ?" Q. ?' [ x9 P5 D
print()
7 e4 Z' W/ v4 L' R6 e0 |
) O- `6 c1 O& `! I; Pif __name__ == "__main__":
7 E! x8 t) l" G( U# t5 ]" V n = 8 # 八皇后
# F" e& B, c5 N0 v solutions = solve_n_queens(n) [0 ]9 I" E$ G4 e) m3 C1 t
print(f"找到 {len(solutions)} 种解决方案:")/ e; g J/ Z7 H6 d$ U9 O
print_solutions(solutions)- U; d" b8 c, X& P
AI写代码
# M- `! n# S7 b* t7 I( C6 G: {
* o* e: P( q2 E: y4 I
$ @# W8 r" H8 U% z$ L; y9 N" G# m& V
2 k( m/ k. a; |4 C2 S7 J' L( ~' f" u! M( ~8 v/ a* ^
, o8 j4 D$ p3 }% ?8 I) ?% G1 n# d, p+ g2 }
! k2 X$ A/ T+ h, b3 N
" T) F- Z0 a* s' I |
|