Giải chi tiết chuyên đề tin học định hướng Khoa học máy tính 11 Kết nối mới bài 15 Bài toán xếp hậu

Giải bài 15 Bài toán xếp hậu sách Chuyên đề Tin học 11 định hướng Khoa học máy tính kết nối tri thức. Phần đáp án chuẩn, hướng dẫn giải chi tiết cho từng bài tập có trong chương trình học của sách giáo khoa. Hi vọng, các em học sinh hiểu và nắm vững kiến thức bài học.

Khởi động

Câu hỏi. Trên bàn cờ vua chúng ta đều biết Hậu là quân cờ mạnh nhất vì nó có thể di chuyển theo tất cả các hướng ngang, dọc và chéo. Một bài toán vui rất nổi tiếng là tìm cách sắp xếp 8 quân Hậu trên bàn cờ sao cho không quân Hậu nào khống chế con nào. Em hãy thử tìm một cách xếp quân Hậu khác với cách xếp như hình sau:

Bài toán tìm tất cả các cách xếp 8 quân Hậu trên bàn cờ vua sao cho các quân Hậu không khống chế lẫn nhau được gọi là bài toán xếp Hậu (n-Queen Problem). Bài toán này được nhà bác học Đức Carl Friedrich Gauss nghiên cứu từ 4 những năm 1850. Bài toán đã được mở rộng trên bàn cờ kích thước bất kì và vẫn đang được tiếp tục phát triển cho đến ngày nay.

15.1

Hướng dẫn trả lời:

Em có thể xếp như sau

Em có thể xếp như sau

1. Mô tả bài toán xếp hậu trên bàn cờ vua

Câu hỏi. Đọc, quan sát, trao đổi và thảo luận về bài toán xếp Hậu tổng quát và cách tiếp cận quay lui để giải bài toán.

Hướng dẫn trả lời:

Trong quá trình quay lui, ta sử dụng một mảng để lưu vị trí của các quân hậu đã đặt. Mỗi lần thêm một quân hậu mới, ta kiểm tra xem nó có đặt được ở vị trí đó không bằng cách kiểm tra xem quân hậu mới đó có trùng hàng, cột hay đường chéo với bất kỳ quân hậu nào đã đặt trước đó không.

        Nếu quân hậu mới đó không thể đặt được ở vị trí đó, ta quay lại đặt lại quân hậu trước đó tại một vị trí khác và tiếp tục thử các vị trí khác cho đến khi tìm được vị trí thích hợp.

Với phương pháp này, ta sẽ duyệt qua tất cả các trường hợp có thể có và đưa ra được kết quả đúng của bài toán.

Câu hỏi 1. Giả sử n = 4, A[0] = 2, A[1] = 0. Hãy tìm A[2].

Hướng dẫn trả lời:

A[k] cần thỏa mãn điều kiện sau:

  • A[k] # A[j] voi Mọi j < k
  • A[k] - A[j]| # |k — j| voi Mọi j < k

Do đó A[2]# 0, 2 và | A[2]-2 | #2 và | A[2]-0 | #1 nên A[2] = 3

Do đó A[3] = 1

Câu hỏi 2. Nếu n = 5, A[0] = 0, A[1] = 3. Tìm các khả năng của A[2].

Hướng dẫn trả lời:

A[k] cần thỏa mãn điều kiện sau:

A[k]A[j]voij<k|A[k]A[j]||kj|voij<k

Do đó A[2] ≠ 0, 3 và | A[2]-2 | ≠2 và | A[2]-3 | ≠1 nên A[2] = 1

2. Thiết lập lời giải bài toán xếp hậu tổng quát

Câu hỏi. Đọc, quan sát, trao đổi và thảo luận về thuật toán và thiết lập chương trình hoàn chỉnh giải bài toán.

Hướng dẫn trả lời:

* Thuật toán: Sử dụng kĩ thuật duyệt quay lui và in ra tất cả phương án nghiệm

 * Thiết lập chương trình hoàn chỉnh giải bài toán.

  1. def showQueen(A):
  2. n = len(A)
  3. for i in range(n):
  4. for j 1n range(n):
  5. if A[j] == i:
  6. print(1, end = " ")
  7. else:
  8. print(0, end = " ”)
  9. print()
  10. def kiemtra(A,1, j):
  11. for k in range(j):
  12. if A[k] == i:
  13. return False
  14. 1f abs(A[k] - 1) == abs(j - k):
  15. return False
  16. return True

Câu hỏi 1. Với n = 3 bài toán xếp Hậu có nghiệm không?

Hướng dẫn trả lời:

Với n = 3, bài toán có nghiệm:

Với n = 3, bài toán có nghiệm:

Câu hỏi 2. Vì sao chương trình trên cần khai báo biến ncount với từ khoá global bên trong hàm trynext().

Hướng dẫn trả lời:

Biến ncount với từ khoá global bên trong hàm trynext() dùng để đếm số phương án thỏa mãn. Biến này được khởi tạo một lần và cập nhật giá trị nếu có phương án phù hợp. Sau khi được khởi tạo, giá trị của biến có thể thay đổi trong suốt quá trình chạy chương trình. Các hàm hoặc phương thức khác nhau trong chương trình có thể truy cập và thay đổi giá trị của biến global này

Luyện tập

Câu hỏi 1. Hãy tìm bằng tay (không cần máy tính) cả hai phương án của bài toán xếp Hậu với n = 4.

Hướng dẫn trả lời:

Hai phương án như sau:.

Hai phương án như sau:

Câu hỏi 2. Nếu chúng ta mô phỏng lưới ô vuông đánh chỉ số các hàng từ dưới lên thì chương trình trên còn đúng không? Nếu phải thay đổi thì cần sửa chỗ nào?

Hướng dẫn trả lời:

Nếu chúng ta mô phỏng lưới ô vuông đánh chỉ số các hàng từ dưới lên thì chương trình trên không còn đúng.

Nếu phải thay đổi thì cần sửa ở chỗ dòng số 5, 13, 15

Sửa i thành n - 1 - i

Vận dụng

Câu hỏi 1. Gọi Q(n) là số các cách xếp n quân Hậu lên bàn cờ kích thước n x n sao cho các quân Hậu không khống chế nhau. Sử dụng thuật toán đã được học, em hãy viết chương trình tính các giá trị Q(n) với n = 4, 5, 6, 7, 8, 9, 10.

Hướng dẫn trả lời:

Chương trình viết như sau

Chương trình viết như sau

Thu được kết quả là:

Thu được kết quả là:

Câu hỏi 2. Tính Q(n) với n = 11, 12, 13.

Hướng dẫn trả lời:

Tương tự, thay đổi giá trị của n ta thu được kết quả sau:

Tương tự, thay đổi giá trị của n ta thu được kết quả sau:

Tìm kiếm google: Giải chuyên đề tin học KHMT 11 KNTT bài 15 Bài toán xếp hậu, giải chuyên đề tin học định hướng Khoa học máy tính 11 kết nối tri thức bài 15 Bài toán xếp hậu, giải chuyên đề tin học KHMT 11 KNTT bài 15 Bài toán xếp hậu

Xem thêm các môn học

Giải chuyên đề khoa học máy tính 11 kết nối tri thức


Copyright @2024 - Designed by baivan.net