Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมตรวจสอบว่าเราจะได้รับโซลูชัน N queens หรือไม่ใน Python


สมมติว่าเรามีเมทริกซ์ไบนารีที่ 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] ]

ผลลัพธ์

จริง