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. 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….
Trang 1TRƯỜ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
Trang 2LỜI NÓI ĐẦU
ý 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
L
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ọnggiú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àiliệ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àithuậ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ủanhó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
Trang 3NHẬN XÉT CỦA GIÁO VIÊN BỘ MÔN
Trang 4
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 HƯỚNG PHÂN TÍCH 17
II TRIỂN KHAI ĐỌAN CODE 17
Trang 5PHẦ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átlê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 7 th 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 chokhô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 :
Trang 6PHẦ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
- 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
Trang 7III Ý 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 x là cột mà con i
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ấtkhô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 quaylạ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 chocon 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ạidò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
Trang 8IV 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 a ( i = 1, 2, …) là một trạng thái được chọn ra từ một i
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 ( a1,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
thành phần thứ i1 của vec tơ nghiệm Nếu thành công ( khi S i1 không rỗng
) ta nhận được vec tơ ( , , ,a a1 2 a i2,a'i1, )a i rồi tiếp tục mở rộng nghiệm mộtphần này Nếu không chọn được '
Trang 9- 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 tatìm ra tất cả các nghiệm của bài toán.
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 i1 là một đỉnh ở mức thứ i-1 của cây Khi đó các đỉnh con của a i1 sẽ làcác trạng thái thuộc tập ứng cử viênS Cây tìm kiếm được thể hiện trong hình i
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
Trang 10V 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êncây bằng các đường đi màu xanh lục
Trang 11- 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), con hậu 2 ở cột 7 (1 X2 ).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ôngcùng đường chéo với chúng
Điều đó có nghĩa là khi đã chọn được nghiệm một phần ( , , ,x x1 2 x k1) thì x chỉ có thể k
lấy trong tập ứng viên S được xác định như sau : k
S ι ��x x x va i k x x voimoii k
Trang 12- 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ứ i-
Trang 13- 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ếukhô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 theocủ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 conhậu được xếp ở cột nào Từ đó dẫn đến với bộ n thành phần x x1, , ,2 x n
Trong đóx i được hiểu quân hậu tại dòng i xếp vào cột thứ j.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éongượ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 = 0 nếu cột j còn trống , cột j a = 1 cột j đã có hậu j
- Để 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 với qui ước nếu đường nào còn trống j
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 b i j , c i j đều có giá trị 0.
Trang 14VI 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
Trang 15VII ĐOẠN CODE 8 HẬU VIẾT C++ CHẠY TRÊN DOS
Trang 17Với n = 5 có 10 cách sắp xếp :
Trang 18PHẦ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
2 Hàm KHỜI ĐỘNG chế độ tô màu
3 Hàm tạo các nút trên giao diên
4 Hàm cho chuột trái
5 Hàm cho chuột phải
6 Hàm cho nút START
7 Hàm cho nút CHESS MOVE
8 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
Trang 192 Ovuong.h
3 Ovuong.cpp
Trang 204 Xep hauView.h
5 Xep hauView.cpp