สมมติว่าเรามีเมทริกซ์ไบนารีที่ 0 แทนเซลล์ว่าง และ 1 แทนราชินีหมากรุกที่เซลล์นั้น เราต้องตรวจสอบว่าเราสามารถเติมบอร์ดนี้และรับโซลูชัน nqueen ที่ถูกต้องหรือไม่ อย่างที่เราทราบกันดีว่าตัวต่อ n queens ขอให้วาง n queens ไว้บนกระดานหมากรุกขนาด n × n เพื่อไม่ให้ราชินีหมากรุกสองตัวโจมตีกันเองได้
ดังนั้นหากอินพุตเป็นแบบ
1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
จากนั้นผลลัพธ์จะเป็น True เนื่องจากวิธีแก้ปัญหาหนึ่งคือ -
1 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน isSafe() นี้จะใช้เวลาคณะกรรมการ i, j
-
สำหรับ r ในช่วง 0 ถึงขนาดของบอร์ด ให้ทำ
-
ถ้า r ไม่เหมือนกับ i และ board[r, j] เหมือนกับ 1 แล้ว
-
คืนค่าเท็จ
-
-
-
r :=i + 1, c :=j + 1
-
ในขณะที่ r <ขนาดแถวของกระดานและ c <ขนาดคอลัมน์ของกระดาน ให้ทำ
-
ถ้า board[r,c] เหมือนกับ 1 แล้ว
-
คืนค่าเท็จ
-
-
r :=r + 1, c :=c + 1
-
-
r:=i + 1, c :=j - 1
-
ในขณะที่ r <ขนาดแถวของกระดานและ c>=0, ทำ
-
ถ้า board[r,c] เหมือนกับ 1 แล้ว
-
คืนค่าเท็จ
-
-
r :=r + 1, c :=c - 1
-
-
r :=i - 1, c :=j + 1
-
ในขณะที่ r>=0 และ c <ขนาดคอลัมน์ของบอร์ด ให้ทำ
-
ถ้า board[r,c] เหมือนกับ 1 แล้ว
-
คืนค่าเท็จ
-
-
r :=r - 1, c :=c + 1
-
-
r :=i - 1, c :=j - 1
-
ในขณะที่ r>=0 และ c>=0 ทำ
-
ถ้า board[r,c] เหมือนกับ 1 แล้ว
-
คืนค่าเท็จ
-
-
r :=r - 1, c :=c - 1
-
-
คืนค่า True
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
r :=0, c :=0
-
stack :=สแต็คใหม่
-
ในขณะที่ r <ขนาดแถวของกระดาน ทำ
-
ถ้า 1 อยู่ในบอร์ด[r] แล้ว
-
r :=r + 1
-
ไปทำซ้ำต่อไป
-
-
มิฉะนั้น
-
พบ :=เท็จ
-
ในขณะที่ c <ขนาดคอลัมน์ของกระดาน ให้ทำ
-
ถ้า isSafe(board, r, c) เป็นจริง
-
กระดาน[r, c] :=1
-
แทรก [r, c] ลงในสแต็ก
-
พบ :=จริง
-
ออกจากวง
-
-
ค :=ค + 1
-
-
หากพบว่าเป็นจริง
-
ค :=0, r :=r + 1
-
-
มิฉะนั้น
-
หาก stack ว่างเปล่า
-
คืนค่าเท็จ
-
-
m :=ลบองค์ประกอบด้านบนออกจากสแต็ก
-
r :=m[0], c :=m[1] + 1
-
กระดาน[r, c - 1] :=0
-
-
-
-
คืนค่า True
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
คลาสโซลูชัน:def Solve(self, board):def isSafe(board, i, j):for r in range(len(board)):if r !=i and board[r][j] ==1:return False r, c =i + 1, j + 1 while r=0:if board[r][c] ==1:return False r +=1 c -=1 r, c =i - 1, j + 1 while r>=0 and c =0 and c>=0:if board[r][c] ==1:return False r -=1 c -=1 return True r =c =0 stack =[] while r อินพุต
<ก่อนหน้า>[ [1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1],[0, 0, 0, 0, 0 ], [0, 0, 0, 1, 0] ]
ผลลัพธ์
จริง