Tải bản đầy đủ (.doc) (24 trang)

Báo cáo đề tài lập trình 8 con hậu_Môn Lý Thuyết Đồ Thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.13 MB, 24 trang )

TRƯỜNG ĐH SƯ PHẠM TP. HỒ CHÍ MINH
KHOA TOÁN – TIN
------------------òòòòòò--------------------

MÔN LÝ THUYẾT ĐỒ THỊ
BÁO CÁO ĐỀ TÀI


LỜI NÓI ĐẦU

L

ý thuyết đồ thị là một nghành của toán học học được khai sinh từ công trình về bài
toán “ 7 cây cầu ở Konigsburg” của nhà toán học Leonhard Euler ( 1707 – 1783 )
công bố vào năm 1736.

Trong khoảng vài mươi năm trở lại đây, cùng với sự ra iời của máy tính số & sự phát triển hết
sức mạnh của nghành Tin Học, Lý thuyết đồ thị càng được quan tâm đến nhiều hơn. Hiện nay,
môn học này được xem là kiến thức cơ sở của môn khoa học máy tính, có vai trò quan trọng
giúp sinh viên có cơ hội tiếp cận với các thuật giải, nâng cao kỹ năng lập trình….
Chính vì vậy, trong quá trình làm đề tài, các thành viên của nhóm đã cố gắng học tập, tìm tài
liệu, lắng nghe sự chỉ bảo tận tình của thầy trong các buổi học. Chúng em đã hoàn thành đề tài
thuật giải 8 con hậu.
Do sự hiểu biết kiến thức chưa sâu về bộ môn lẫn kỹ thuật lập trình, chắc chắn đề tài của
nhóm vẫn còn nhiều thiết sót. Vì vậy, mong thầy xem xét lượng thứ, và đóng góp ý kiến để
chúng em ý thức hơn và rút kinh nghiệm cho các đề tài sau này.
Cuối cùng, chúng em chân thành cám ơn thầy đã tạo cơ hội cho nhóm thực hiện đề tài.

2



NHẬN XÉT CỦA GIÁO VIÊN BỘ MÔN
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................

3



MỤC LỤC
PHẦN 1 : SƠ LƯỢC VỀ LỊCH SỬ BÀI TOÁN 8 HẬU
PHẦN 2 : YÊU CẦU BÀI TOÁN.........................................................................5
PHẦN 3 : PHÂN TÍCH THUẬT GIẢI BÀI TOÁN 8 HẬU
I. HÌNH ẢNH PHẦN MỀM .......................................................................6
II. HỖ TRỢ THỰC HIỆN .............................................................................6
1. Tài liệu tham khảo :
2. Môi trường cài đặt :
III.Ý TƯỞNG THUẬT GIẢI BT 8 HẬU......................................................7
IV. TH GIẢI THUẬT DFS KẾT HỢP QUAY LUI......................................8
V. MINH HỌA CỤ THỂ VỀ DFS VÀ BACKTRACKING.......................9
VI. BẢNG TỔNG KẾT CHO BÀI TOÁN N CON HẬU...........................14
VII. ĐOẠN CODE 8 HẬU VIẾT C++ CHẠY TRÊN DOS...................15
PHẦN 4 : PHÂN TÍCH ĐOẠN CODE VIẾT BẰNG C++
TRÊN MÔI TRƯỜNG MFC
I.
II.

HƯỚNG PHÂN TÍCH ......................................................................17
TRIỂN KHAI ĐỌAN CODE............................................................17

4


PHẦN 1 : SƠ LƯỢC VỀ LỊCH SỬ BÀI TOÁN 8 CON HẬU
-

Bài toán được được ra vào năm 1984 bởi kỳ thủ Max Bezzel, và sau đó được nhiều nhà
toán học , trong đó có Gauss và Geog Cantor, nghiên cứu về bài toán này và tổng quát
lên thành bài toán xếp xếp hậu.


-

Lời giả đầu tiên được đưa ra bởi Franz Nauck năm 1850 và tổng quát thành bài toán n
con hậu. Năm 1874, S. Gunther đưa ra phương pháp tìm lời giải bằng cách sử dụng
định thức , và J.W.L. Glaisher hoàn chỉnh phương pháp này.

-

Tám con hậu được ứng dụng trong trò chơi máy tính The 7th Guest vào những năm
1990.

PHẦN 2 : YÊU CẦU BÀI TOÁN
-

Đặt 8 quân hậu trên bàn cờ vua 8 x 8 sao cho không có quân hậu nào có thể tấn công
được các con khác ( theo luật chơi cờ vua), nghĩa là phải đặt các quân hậu sao cho
không có hàng, cột hoặc đường chéo nào trên bàn cờ có hơn 1 quân hậu.

-

Minh họa :

5


PHẦN 3 : PHÂN TÍCH THUẬT GIẢI BÀI TOÁN 8 HẬU
I. HÌNH ẢNH PHẦN MỀM ALGORITHM 8 QUEES

II. HỖ TRỢ THỰC HIỆN :


-

3. Tài liệu tham khảo :
3.1 Đoạn code tham khảo :
Đọan code 8 HẬU viết bằng C++ chạy trên DOS.
Đọan code 8 HẬU viết bằng C có hỗ trợ đồ họa.

-

3.2 Sách tham khảo :
Phân tích thiết kế thuật giải.
Lý thuyết đồ thị
Hướng dẫn viết chương trình bằng VISUAL C++.
Lập trình windowns bằng C++
www.google.com.vn từ khóa “ 8 con hậu…”

-

4. Môi trường cài đặt :
Viết bằng ngôn ngữ Visual C++ lập trình WIN với chương trình MFC.

6


III. Ý TƯỞNG THUẬT GIẢI BÀI TOÁN 8 CON HẬU.
-

-


-

Vì các con hậu phải nằm trên các hàng khác nhau, ta có thể đánh số các con hậu từ
1 đến 8, con hậu i là con hậu đứng ở hàng thứ i ( i= 1,…,8). Gọi xi là cột mà con
hậu thứ i đứng.
Ta đặt con hậu vào dòng đầu tiên sẽ có 8 lựa chọn cho quân hậu đầu tiên này.
Sau đó đặt con hậu thứ 2 trên dòng hai với điều kiện sao cho con hậu thứ nhất
không tấn công được. Ta có được vị trí thích hợp cho quân hậu 2 .
Tiếp tục cho con hậu thứ 3, 4… với vị trí phù hợp.
Nếu giả sử tới con hậu thứ 5 ở dòng năm bị khống chế hoàn toàn, ta buộc phải quay
lại con hậu 4 dòng bốn đặt con hậu lại ở cột khác. Nếu việc di chuyển này giúp cho
con hậu thứ năm có chỗ đứng thì xếp tiếp cho con hậu 6. Ngược lại phải quay lại
dòng 3 xếp con hậu 3 sao cho con hậu 4 có cho đứng và cả con hậu thứ 5 cũng có vị
trí thích hợp.
Tiếp tục cho đến hết .

7


IV. TÌM HIỂU GIẢI THUẬT TÌM KIẾM SÂU KẾT HỢP QUAY LUI
-

Trong nhiều vấn đề, việc tìm nghiệm của vấn đề được quy về tìm một dãy các trạng thái
( a1,a2,…,ak,…an) trong đó mỗi ai ( i = 1, 2, …) là một trạng thái được chọn ra từ một
tập hữu hạn Ai các trạng thái, thỏa mãn các điều kiện nào đó.

-

Chúng ta sẽ gọi dãy các trạng thái ( a 1,a2,…,ak,…an) thỏa mãn các yêu cầu của bài toán
là vec tơ nghiệm. Ý tưởng của kỹ thuật quay lui là ta xây dựng vec tơ nghiệm xuất phát

từ vec tơ rỗng, mỗi bước ta bổ sung thêm một thành phần của vec tơ nghiệm, lần lượt
a1 , a2 ....

-

Đầu tiên, tập S1 các ứng cử viên có thể là thành phần đầu tiên của vec tơ nghiệm chính
là A1 .

-

Chọn a1 �S1 , ta có vec tơ ( a1 ). Giả sử sau bước thứ i - 1, ta đã tìm được vec tơ
(a1 , a2 ,...., ai 1 ) . Ta sẽ gọi các vec tơ như thế là nghiệm một phần ( nó thỏa mãn các đòi
hỏi của bài toán, nhưng chưa “đầy đủ.”) .

-

Bây giờ ta mở rộng nghiệm một phần (a1 , a2 ,...., ai 1 ) bằng cách bổ sung thêm thành
phần thứ i Muốn vậy, ta cần xác định tập Si các ứng cử viên cho thành phần thứ i của
vec tơ nghiệm. Cần lưu ý rằng, tập Si được xác định theo yêu cầu của bài toán và các
thành phần a1 , a2 ,...., ai 1 , đã được chọn trước, và do đó Si, là tập con của tập con của
tập Ai, các trạng thái.
Có hai khả năng :

-



Nếu Si không rỗng, ta chọn ai �Si và thu được nghiệm một phần
(a1 , a2 ,..., ai 1 , ai ) , đồng thời loại ai đã chọn ra khỏi Si. Sau đó ta lại tiếp tục
mở rộng nghiệm một phần (a1 , a2 ,..., ai ) bằng cách áp dụng đệ quy thủ tục mở

rộng nghiệm.



Nếu Si rỗng, điều này có nghĩa là ta không thể mở rộng nghiệm một phần
(a1 , a2 ,..., ai  2 , ai 1 , ai ) , thì ta quay lại chọn phần tử mới a 'i 1 trong Si 1 làm
thành phần thứ i  1 của vec tơ nghiệm. Nếu thành công ( khi Si 1 không rỗng
'
) ta nhận được vec tơ (a1 , a2 ,..., ai  2 , a i 1 , ai ) rồi tiếp tục mở rộng nghiệm một
'
'
phần này. Nếu không chọn được a i 1 thì ta quay lui tiếp để chọn a i  2 ... Khi
'
quay lui để chọn a 1 mà S1 đã trở thành rỗng thì thuật toán dừng lại.

8


-

Trong quá trình mở rộng nghiệm một phần, ta cần kiểm tra xem nó có là nghiệm không.
Nếu là nghiệm, ta ghi lại nghiệm hoặc in ra nghiệm này. Kỹ thuật quay lại cho phép ta
tìm ra tất cả các nghiệm của bài toán.

-

Kỹ thuật quay lui mà ta đã trình bày thực chất là kỹ thuật đi qua cây tìm kiếm theo độ
sâu( Depth First Search – DFS)

Cây tìm kiếm được xây dựng như sau:




Các đỉnh con của gốc là các trạng thái của S1
Giả sử a i 1 là một đỉnh ở mức thứ i-1 của cây. Khi đó các đỉnh con của a i 1 sẽ là
các trạng thái thuộc tập ứng cử viên Si . Cây tìm kiếm được thể hiện trong hình

Trong cây tìm kiếm, mỗi đường đi từ gốc tới một đỉnh tương ứng với một nghiệm một phần.

9


V. TRƯỜNG HỢP CỤ THỂ VỀ DFS VÀ BACKTRACKING
Minh họa quá trình tìm kiếm lời giải cho bài toán n hậu với n = 4 .
Ở trạng thái xuất phát, trên dòng 1 có 4 lựa chọn cho quân hậu:
- Quân hậu thứ nhất có thể đứng ở các cột 1,2,3,4.
- Nếu lựa chọn Ô (1,1), ở dòng thứ hai chỉ còn hai lựa chọn là cột 3 và cột 4.
- Nếu lựa chọn cột 3, trên dòng thứ 3 sẽ bị không chế hoàn toàn .
- Ta loại bỏ phương án chọn ô (2,3) này và xét tiếp phương án chọn ô (2,4).
- Khi lựa chọn ô (2,4) ta cũng chỉ đặt thêm được một quân hậu ở dòng thứ ba.
- Dòng thứ tư lại không thể đặt bất kỳ quân hậu nào.
- Do đó ta lùi lại dòng thứ nhất, xét khả năng tiếp theo (1,2), ta lần lượt được dãy các ô
(1,2), (2,4), (3,1), (4,3).
- Tiếp tục với ô(1,3), (1,4).
Chỉ có hai đường đi từ gốc tới lá với độ dài 4 nên bài toán 4 hậu chỉ có 2 lời giải thể hiện trên
cây bằng các đường đi màu xanh lục.

10



- Minh họa với n = 8

-

Như trong ví dụ ta gọi cột của con hậu ở dòng i ( i = 1,…,8) là X 1 .
Nghiệm của bài toán là vector (X1,X2,…,X8), chẳng hạn nghiệm trong hình là
(1,7,5, 8, 2, 4, 6, 3 ).
Con hậu 1 ( ở dòng 1 ) có thể đặt ở một trong tám cột. Do đó So = ( 1, 2, …, 8).
Khi ta đã đặt con hậu 1 ở cột 1 ( X 1 = 1), con hậu 2 ở cột 7 ( X 2  7 ).
Như trong hình trên, thì con hậu 3 chỉ có thể đặt ở trong các cột 2, 4, 5.

Tổng quát, khi ta đặt các con hậu 1, 2, …., k-1 thì con hậu k ( con hậu ở dòng k) chỉ có
thể đặt ở một trong các cột khác với các cột mà con hậu 1, 2, …, k-1 đã chiếm và không
cùng đường chéo với chúng.
Điều đó có nghĩa là khi đã chọn được nghiệm một phần ( x1 , x2 ,..., xk 1 ) thì xk chỉ có thể
lấy trong tập ứng viên Sk được xác định như sau :
Sk ι{x��
{1,2,...,8}xk
k

xi va(i k )

( xk

xi )voimoii

11

k}



Giải thích 1 :
-

Mỗi lời giải được ký hiệu bằng một mảng solution[1..n], trong đó solution[i]= j là cột
mà quân hậu ở hàng thứ i đứng.
Các ô trên các đường chéo cộng chứa ô (i, j) đều có tổng bằng i+j. Tổng này nhận các
giá trị từ 2 đến 2n nên ta đánh số các đường chéo này từ 1 đến 2n-1.

-

Như vậy các ô trên đường chéo cộng thứ nhất có tổng chỉ số dòng và cột là 2, các ô trên
đường chéo thứ k có tổng ấy là k+1.

-

Ta dùng một mảng Boolean Ok_plus[1..2n-1] để kí hiệu trạng thái đã có quân hậu nào
trên đường chéo cộng thứ k chưa, nghĩa là Ok_plus[k]=True nếu đã có một quân hậu
đứng chiếm giữ đường chéo cộng thứ k.

-

Tương tự, các ô trên một đường chéo trừ có hiệu như nhau. Hiệu này nhận giá trị từ 1-n
đến n- 1. Đánh số từ 1 đến 2n-1 từ đường chéo có hiệu chỉ số dòng trừ chỉ số cột là 1-n
đến đường chéo có hiệu ấy bằng n-1. Khi đó đường chéo trừ thứ k có hiệu chỉ số dòng
trừ chỉ số cột là k+n. Ta cũng dùng mảng ok_minus[1..2n-1] để chỉ trạng thái của các
đường chéo này.

-


Giải thuật này cố gắng đặt quân hậu ở dòng thứ i vào cột nào đó , bắt đầu từ dòng thứ
nhất (luôn có thể đặt được). Nếu ở dòng thứ i ta đặt quân hậu vào cột thứ j, thì nó
khống chế tất cả các ô trong cột thứ j,đường chéo cộng thứ i+j-1, đường chéo trừ thứ ij+n.

-

Nếu có thể đặt được quân hậu ở dòng i và i = n ta có một lời giải.
12


-

Nếu đặt được và i < n ta tiếp tục cố gắng đặt quân hậu tiếp theo vào dòng thứ i+1. Nếu
không đặt được, ta quay lại nhấc quân hậu ở dòng thứ i-1 và tìm phương án tiếp theo
của dòng thứ i-1.

Giải thích 2 : Bàn cờ n x n , sắp n con hậu
Bàn cờ có n hàng được đánh số từ 1 đến n, cột được đánh số từ 1 đến n.
Bàn cờ có 2*n – 1 đường chéo xuôi được đánh số từ 2*n – 1 đến 2*n – 2,
Bàn cờ có 2*n – 1 đường chéo ngược được đánh số từ 2*n – 1 đến 2*n – 2,
Ví dụ : Bàn cờ 8 x 8 có.
 8 dòng được đánh số từ 1 đến 8,
 8 cột được đánh số từ 1 đến 8,
 15 đường chéo xuôi , 15 đường chéo ngược được đánh số từ 1... 15.
Vì trên mỗi hàng chỉ xếp được đúng một quân hậu, nên chúng chỉ cần quan tâm đến con
hậu được xếp ở cột nào. Từ đó dẫn đến với bộ n thành phần x1 , x2 ,..., xn .
Trong đó xi  j được hiểu quân hậu tại dòng i xếp vào cột thứ j. j  1...n, i  1...n
Điều kiện ô ( i, j) chưa bị quân hậu khác chiếu đến theo cột, đường chéo xuôi, đường chéo
ngược.
Ví dụ : Bàn cờ 8 x 8 có.

Các quân hậu được đặt tại a[1][2] và a[7][2] đang tấn công vì chúng đang ở cùng một cột 2.
Các quân hậu được đặt tại a[1][2] và a[5][6] đang tấn công vì chúng đang ở cùng một
đường chéo.
Do đó, các vị trí a[i][j] và a[k][l] là đang tấn công nếu :
 i= = k , hay
 j = = l, hay
 Abs ( i-k ) = = asb ( j – l) abs là trị tuyệt đối.
-

Việc kiểm soát theo hàng ngang là không cần thiết vì trên mỗi hàng chỉ cho phép xếp
đúng một con hậu. Việc kiểm soát theo hàng dọc được ghi nhận với dãy biến logic a j
với qui ước a j = 0 nếu cột j còn trống , cột a j = 1 cột j đã có hậu .

-

-

Để ghi nhận đường chéo xuôi và đường chéo ngược có chiếu tới ô ( i, j ) hay không ta
sử dụng phương trình i +j = const, và i - j = const.
Đường chéo thứ 1 được ghi nhận bởi dãy biến b j .
Đường chéo thứ 2 được ghi nhận bởi dãy biến c j với qui ước nếu đường nào còn trống

-

thì giá trị tương ứng của nó là 0 ngược lại là 1.
Nếu cột j được chấp nhận khi cả ba biến a j , bi  j , ci  j đều có giá trị 0.

-

13



VI. BẢNG TỔNG KẾT CHO BÀI TOÁN N CON HẬU

Bài toán tám quân hậu có 92 lời giải khác nhau. Nếu không phân biệt các lời giải là ảnh của
nhau qua phép đối xứng, phép quay bàn cờ thì chúng chỉ có 12 lời giải đơn vị như biểu diễn
dưới đây

14


VII. ĐOẠN CODE 8 HẬU VIẾT C++ CHẠY TRÊN DOS

15


KẾT QUẢ

16


Với n = 5 có 10 cách sắp xếp :

17


PHẦN 4 : PHÂN TÍCH ĐOẠN CODE VIẾT BẰNG C++
TRÊN MÔI TRƯỜNG MFC
III.


HƯỚNG PHÂN TÍCH
1. MainFm.cpp
2. Ovuong.h
3. Ovuong.cpp

4. Xep hauView.h
5. Xep hauView.cpp
1. Phần hàm nút diều khiển :
1.
2.
3.
4.
5.
6.
7.
8.

Hàm TÔ MÀU
Hàm KHỜI ĐỘNG chế độ tô màu.
Hàm tạo các nút trên giao diên
Hàm cho chuột trái
Hàm cho chuột phải
Hàm cho nút START
Hàm cho nút CHESS MOVE
Hàm cho nút NOT CHESS

2. Phần hàm thực thi.
9. Hàm xử lý ( rất quan trọng).
IV.


TRIỂN KHAI ĐỌAN CODE
1. MainFm.cpp : tạo ra khung giao diện

18


2. Ovuong.h

3. Ovuong.cpp

19


4. Xep hauView.h

5. Xep hauView.cpp

20


21


22


23


24




×