Các lời giải đầu tiên được đưa ra bởi Franz Nauck năm 1850, ông cũng đã tổng quát hóa bài toán này thành bài toán n quân hậu.. Trong đề tài nảy, người viết sẽ cài đặt một cấu trúc dữ liệ
Trang 1
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2
VIỆN CNTT
BÀI TẬP LỚN
CHU DE 22: Cai đặt chương trình bài toán 8 quan hậu
SVTH : Nguyễn Nhật Khánh
Đỗ Ngọc Mai
Lớp : K48B Sư phạm Tin học
MỤC LỤC
Trang 2
NỘI DỰNG 2: 1 1 221 11211112111121111211212 1111111111111 1e 1 CHUONG I: TONG 00/9 NHgggve 1 1 1
L LỜIMỞ ĐẦU Q.5 1 121121111111111211111121211 1121121111211 111E 211101111 1
IL MÔ TẢ BÀI TOÁN - 2222 212211221121712211221121221121211222 re 1
TL MUC TIEU CAN DAT eccccccccsccsssessseesssssssessssssessvesaressetsresesitsressessessesanearenees 2
IV HƯỚNG GIẢI QUYẾT 22-22 2E122152211221127112211211221121121112121211 xe 2
V KÉ HOẠCH THỰC HIỆN 2 s21 32192155125151251251212511121 1x11 11281 gye 3
CHƯƠNG II: CƠ SỞ LÝ THUYÊTT 2.252 2S2EE2221122112211221121112711221121111 2112 cty 4 I._ BÀN CỜ VUA S 2212222 11221222121221122112212222 22a 4
II ễ ĐỆ QUY (RECURSIƠN) Q1 S222 TH HH2 212122111 ee 5
II KỸ THUẬT QUAY LUI (BACKTRACKTNG) 22 222222 HH reu 5 CHUONG II: KET QUA - UNG DUNG Looe ceccccecccscsssvesecsesvssesscsveuecessvesessestesuensareateseevees 6
IL PHAN TICH YEU CAU BAI TOAN "— 6
1 Cài đặt cấu trúc dữ liệu tổ chức bàn cờ -.-: 2c St t2 xxx EtErrrrrrrrrre 6
2 Cai dat thuật toán tim kiểm sâu kết hợp quay li ceccccccsccecceeeseeeeeeee eee 7
3 Hiển thị bản cờ sau mỗi nước ổi 222 SE E 151 15155 11T E5 Hrree 7
II THIẾT KÉẾ GIẢI THUẬTT -2-©222+222EE2E1227E12E127112212271122112111211121 2 xe 8
L, Ham Lay Maun ccc ccccccceccceeccecnssceceseecesseecessseeessseesseeessseeecsseeessseeens 8
Pa 0‹iosriadadađaiaiađiaiaaaaaaaaadaẢ 8
3 Hàm KholTao c1 221111121111 11 1111195 119g 1110111101111 1k kg 2x xet 8
Ny on 0B.) 6ÈẶAỤIỢỤOỢẠVẠV 9
6 Hàm Velau L Q00 0112211111119 1111111511111 111111 k kg kg 9
7 Hàm DatQuanlHau - 2 CC 111222 22221111111511 1111110112011 11 1121111111 1k x4 9
Ill GIGI THIEU a:i0/9)/ea0:ì))2 10 13
TÀI LIỆU THAM KHẢO - 522221 222222122112211221112112271121122712110.1112 21a 17
Trang 3NỘI DUNG CHƯƠNG I: TỎNG QUAN
I LỜI MỞ ĐÀU
Cờ vua là một trò chơi giải trí xuất hiện từ khoảng thế kỷ thứ VI và ngày càng trở nên phô biến trên thé giới Bên cạnh việc chơi cờ giải trí, người ta còn suy nghĩ
ra nhiều bài toán xung quanh bàn cờ vua Một trong những bài toán phố biến về cờ vua đó là bài toán “8 quân hậu” Đây cũng là một trong nhưng bài toán ni tiếng và quen thuộc đối với người lập trình
Bài toán 8 quân hậu được đưa ra vào năm 1848 bởi kỳ thủ Max Bezzel, nhiều nhà toán hoc (trong do co Gauss va Georg Cantor) da co cac công trình nghiên cứu
về bài toán này và tổng quát nó thành bài toán xếp hậu Các lời giải đầu tiên được đưa ra bởi Franz Nauck năm 1850, ông cũng đã tổng quát hóa bài toán này thành
bài toán n quân hậu
Trong đề tài nảy, người viết sẽ cài đặt một cấu trúc dữ liệu đề tô chức bàn cờ và cài đặt một thuật toán đề máy tính tìm ra đủ 8 vị trí đặt quân hậu trên bàn cờ
II MÔ TẢ BÀI TOÁN
Đặt 8 quân hậu trên bàn cờ vua 8x8 sao cho không có quân hậu nảo có thể tấn
công được con khác không kẻ đến màu sắc Theo luật cờ vua thì một con hậu có thể nhin thay nhimg con co khac nam trén hàng, hoặc cột, hoặc hai đường chéo chứa
nó 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 | quan hậu
Hình 1: Hai cách đặt 3 quân hậu phù hợp điều kiện bài toán
Trang 4III MỤC TIỂU CÀN ĐẠT
Sau khi hoàn thành đề tài, cần đạt được những mục tiều sau:
® Trước tiên phải hiểu được luật chơi cờ vua, cũng như cách tô chức bàn cờ trên thực tê
e Nam ving một ngôn ngữ lập trình dé str dung giải quyết bài toán
© - Nắm vững lý thuyết cơ bản về cấu trúc đữ liệu và giải thuật đề cài đặt bàn cờ
và cách đặt các quân hậu
s® Nam vững và cài đặt được giải thuật tìm kiếm sâu kết hợp quay lui (Backtracking) dé giai quyét bai toan nay
© Hién thị bản cờ sau mỗi bước đi dưới đạng đỗ họa
® - Dịch chương trỉnh sang file thực thi
IV HƯỚNG GIẢI QUYÉT
Bat kỳ ai khi thử tìm lời giải cho bai toan tam quan hau thuong ngay lap tức bị cuốn vào việc tìm cách đặt những con hậu lên bàn cờ một cách ngâu nhiên, hoặc theo một quy tắc nào đó Và với cách nào đi nữa thì một điều chắc chắn là con hậu đặt sau sẽ không bao giờ được nhìn thấy con hậu đã đặt trước đó Bằng cách này, nếu may mắn một người có thể đặt được cả tám quân hậu thỏa yêu câu bài toán
Nếu không may, một con hậu phải được lấy đi để đặt lại vào những chỗ khác và
việc tìm lời giải được tiếp tục
Để biêu diễn, cài đặt bàn cờ vua bằng ngôn ngữ lập trình, thoạt tiên ta nghĩ tới là dùng mảng 2 chiều đề biêu diễn vị trí từng ô vuông trong bàn co Cách biêu diễn đó
là đúng, tuy nhiên trong trường hợp bài toán ổ quân hậu này, nếu ta dùng cách đó thì không được tối ưu, sẽ dẫn tới các thao tác cồng kẻnh trong việc thử các quân hậu, ở đây ta không lập trình toàn bàn cờ vua hoàn hao dé choi Ta chi str dung quan hau cho nén chi cần quan tâm tới ô ở 2 giá trị, đó là ô đó có quân hậu nảo khống chế (ô cắm), hay chưa không chế (ô được phép) Nói một cách khác là một ô
cờ sẽ nhận một trong 2 giá trị là cảm hay được phép, khi cài đặt vào chương trình
ta sẽ dùng hai giá trị nào đó để máy tính hiểu được hai trạng thái này
Các bước giải quyết bài toán:
© Tai budc thir i, ta tim vi tri dé đặt quân hậu thứ 1 vào ô chưa bi khống chế Sau đó tìm tiếp vi tri cho quan hau thiri+1
® Nếu ở bước thứ ¡ không tìm thấy vị trí đặt của quân hậu thì chúng ta phải quay lại xét đền vị trí khác của quân hậu thứ 1- l
Trang 5e - Trường hợp suy biến của bài toán là khi chúng ta đã đặt cho quân hậu thứ 8, nghĩa là cả § quân hậu đã được xếp trên bàn cờ và đúng với điều
kiện
Chúng ta sẽ viết một hàm Try đề giải quyết bài toán này Công việc cần làm tại một thời điêm (một trạng thái của bàn cờ nào đó mà sô quân hậu chưa đủ) là:
® - Đặt thêm một con hậu vào vi tri hợp lệ
e - Gọi đệ quy đề xử lý tương tự số hậu cân xử lý tiếp đã giảm I
V KÉ HOẠCH THỰC HIỆN
Đề tai dự kiến hoàn thành sau 10 tuần, cụ thê như sau:
© Tìm hiểu đề tài: l tuần
e Tìm hiểu cấu trúc đữ liệu và giải thuật sử dụng, vẽ lưu đồ: 2 tuần
© - Viết code và kiểm thử: 4 tuần
© - Viết báo cáo và hoàn chỉnh chương trình: 3 tuần
Trang 6CHƯƠNG II: CƠ SỞ LÝ THUYÉT
| BÀN CỜ VUA
Đường chéo cộng
Đường chéo phụ
Nĩnh 2- Bàn cờ vua
X4
<<
XI
X4
<<
<<
<< Nà
>
><
yd
Ban cờ vua là một bảng
hình vuông, gồm 8 dong,
và § cột, tạo ra 64 ô hình vuông với các màu đậm và
nhạt xen kẽ nhau Duong chéo chính là đường chéo gôm các ô mà chỉ sô dòng và chỉ số cột băng nhau
Đường chéo phụ là đường chéo đôi xứng với đường chéo chính qua trục của bản cờ
Đường chéo trừ là đường chéo song song với đường chéo chính
Đường chéo cộng là đường chéo song song với đường chéo phụ
x
X
<>
._ Đường chéo trừ
` Đường chéo chính Mình 3: Minh họa các khải niệm trên bàn cờ vua
4
Trang 7II DE QUY (RECURSION)
Dé quy (recursion) la phuong phap dung trong cac chuong trinh may tinh trong
đó có một hàm tự gọi chính nó
Trong toán học và khoa học máy tính, các tính chất (hoặc cầu trúc) được gọi là
đệ quy nếu trong đó một lớp các đối tượng hoặc phương pháp được xác định bằng việc xác định một số rất ít các trường hợp hoặc phương pháp đơn giản (thông thường chỉ một) và sau đó xác định quy tắc đưa các trường hợp phức tạp về các trường hợp đơn giản
Một hàm được gọi là đệ quy nêu bên trong thân hàm có lệnh gọi đến chính
nó Ví dụ: Người ta định nghĩa giai thừa của một số nguyên đương n như sau: /=J* 2 *3 * *ứn-]) *n = (m-l)! *n (với 0!=1)
Như vậy, đề tính nl ta thay néu n=0 thi n!=1 nguoc lai thì nl=n * (n-1)!
Ill KY THUAT QUAY LUI (BACKTRACKING)
Kỹ thuật quay lui (Backtracking) như tên gọi của nó, là một quá trình phân tích
đi xuống và quay lui trở lại theo con đường đã đi qua Tại mỗi bước phân tích chúng ta chưa giải quyết được vấn đề do còn thiếu cứ liệu nên cứ phải phân tích cho tới các điểm dừng, nơi chúng ta xác định được lời giải của chúng hoặc là xác định được không thể (hoặc không nên) đi theo hướng này Từ các điểm dừng này chúng ta quay ngược trở lại con đường mà chúng ta đã đi qua để giải quyết các vấn
đề còn tồn đọng và cuối cùng ta sẽ giải quyết duoc van dé ban dau
Quy trình đó thường được cài đặt bằng một hàm đệ quy mà trong đó mỗi thê hiện của hàm lấy thêm một biến va lần lượt gán tất cả các giá trị co thê cho biến đó, với mỗi lần gán trị lại gọi chuỗi đệ quy tiếp theo đề thử các biến tiếp theo Giải thuật quay lui tỏ ra hiệu quả trong những trường hợp mà ban đầu tưởng như có rat nhiéu khả năng lựa chọn, nhưng sau đó chỉ một sô ít khả năng là còn sót lại sau tiễn trình kiêm tra xa hơn Trong các bài toán xếp thời khóa biểu, chăng hạn trong việc tổ chức các vòng dau thé thao, sự lựa chọn thời gian cho một số trận đấu ban đầu thường là rất dễ, nhưng càng về sau, các ràng buộc sẽ làm giảm đáng kê các khả năng có thê
Trong bài toán “8 quân hậu ", ta sur dụng kỹ thuật quay lụi “vét cạn”, nghĩa là phải đi tới tất cả các điểm dừng rôi mới quay lại Phân tiếp theo đây chúng ta sẽ tìm hiểu cách hiện thực cụ thê cho bài toán này, để thấy được ý tưởng để quy và giải thuật quay lui là cốt lõi của bài toán ở đạng này
Trang 8CHUONG Ill: KET QUA - UNG DUNG
I PHAN TICH YEU CAU BÀI TOÁN
4 Cài đặt cấu trúc dữ liệu tổ chức bàn cờ
Theo luật cờ vua, quân hậu ăn được quân khác nằm trên cùng hàng, cùng cột,
và cùng đường chéo Cho nên ta thấy mỗi cột chỉ có duy nhất một quân hậu Như vậy ta có thê ký hiệu quân hậu ở dòng thứ ! là 1 lúc này 1 trở thành chỉ số đòng và việc chọn còn lại được tiền hành trên chỉ số cột, ta đặt là j
Trên bàn cờ ta thấy rằng tat cả các ô trên cùng một đường chéo cộng có tông chỉ số ¡ và j bằng nhau, tức là tổng chỉ số cột và chỉ số hàng Còn các ô trên cùng đường chéo trừ thì có hiệu số ¡ trừ j là không đôi Bàn cờ có 15 đường chéo cộng
và 15 đường chéo trừ
Như vậy, chúng ta có thê nắm giữ các ô chưa bị các quân hậu nhìn thấy bằng cách sử dụng 3 mảng:
e int Cot[board _: size]; với Cot[I|El có nghĩa là cột thứ ¡+rl chưa bị khống chế, Cot[i]E0 có nghĩa là cột thứ ¡+1 bị khống chế
¢ int CheoTru[2* board_size -1]; với CheoTru[iJ=1 co nghĩa là đường chéo trừ thứ ¡r1 chưa bị không chê, CheoTrulilE0 có nghĩa là đường
chéo trừ thứ i+I bị không chê
e int CheoCong[2* board_size -1]; với CheoCong[i]El có nghĩa là đường chéo cộng thứ ¡r1 chưa bị không chê, CheoCong[I]E0 có nghĩa
là đường chéo cộng thứ 1+1 bị không chê
Với cách chọn các biến như trên thi ta dé dang quan ly ban co Khi dat quan
hậu thì ta sẽ cắm các cột, hàng và các đường chéo cộng, chéo trừ mà quân hậu đó
đứng Tức là khi đặt hậu vào dòng 1 và cột ] thì ta gán Cot[j-L]JE0; CheoTru[i- J†7]E0; CheoCong[i+J-2]E0
Khi muốn bỏ không dat quan hau thi ta gan lai các giá trị bằng 1: Cot[j-1]=1; CheoTrufi-j+7]=1; CheoCong[i+j-2]=1
Cách làm như vậy rất thuận tiện và phù hợp khi ta phải thử quân hậu nhiều lần trong các trường hợp quay lui đề thử lại vị trí hậu
Trang 91ị2|13|14|5|6|71498 8|JI7|I6|5|I14|)3|412|1
5 6 78/9 10 11 12 12|11/10|9|8 7|6 5 6/718|9 |10|11|12 13 13|12 11|10|9 8|7 6 7.8.9 |10|11|12|13 14 14 13 12 11 10 9.8 7
Hình 4: Các vị trí trên bàn cờ được mô hóa theo cac mang CheoCong, CheoTru
2 Cài đặt thuật toán tìm kiếm sâu kết hợp quay lui
_ Việc tìm kiếm vị trí đặt hậu được thiết kết bằng giải thuật đệ quy tìm kiếm sâu
kêt hợp quay lui, băng cách thử từng vị trí quân hậu Xét việc thử đặt quân hậu ở dòng thứ a:
+ Xét cột thứ b (b chay tir 1 dén 8) cua dong a Dat i=a-1 va j=b-1, néu vi tri (i, j) chua bi khong che (Nghia la: Cot[jJ=l && CheoTrufi-j+7J=l && CheoCong[i+jJ=1) thi ta dat hau o vi tri G, 3) (Nghia la: ViTnfiJ=b; Cot[j]=0; CheoTruli-j+7]E0: CheoCong[i+j]E0) Nếu không đặt được trên dòng a thì chuyên sang bước 3
+ Nếu đã đặt được 8 quân hậu thì dừng và đưa ra lời giải Ngược lại, nêu chưa
đủ § quân hậu thì ta đệ quy lại việc xét đặt quân hậu ở dòng thi a+1
+ Nếu chưa tìm được lời giải thì quay lui lại, bỏ vị trí vừa đặt (Thiết lập lại Cot[jJ=1; CheoTru[i-j+7]=1; CheoCong[i+j]=1)
3 Hién thi ban cờ sau mỗi nước di
Việc hiển thị bàn cờ sau mỗi bước đi phụ thuộc vào thuật toán tìm kiếm sâu kết hợp quay lui đã trình bày ở trên Bàn cờ ban đầu chưa có quân hậu nào Quân hậu đầu tiên được người dùng tùy chọn và được hiển thị trên bàn cờ Xét việc đặt quân hậu ở đòng tiếp theo (dòng thứ a):
+ Ở cột thứ b (b chạy từ 1 đến 8) của dòng a Nếu vị trí (¡,j) chưa bị không chế
thì ta hiện thị quân cờ ở vị trí này Nếu không tìm được vị trí nào trên dòng a thì
chuyên sang bước 3
¬ Nếu đã đặt được § quân hậu thì chương trình đã hiển thị thành công bàn cờ
kêt quá Ngược lại, xét việc hiện thị quân hậu ở dòng thứ a~T
+ Nếu chưa tìm được lời giải thì quay lui lai, xóa quân hậu vừa mới đặt
Trang 10ll THIẾT KÉ GIẢI THUẬT
Chương trình bao gồm hàm main() các chương trình cơn sau:
e void LayMau(int i);
¢ void ktdh();
¢ void KhoiTao();
¢ void SauDatHau();
¢ void VeBanCo(;
¢ void VeHau(); Ham vé quan hậu
¢ void DatQuanHau(int a, int b); Ham dat quan hau tai dong a, cét b
¢ void Try(int i); Ham dé quy, thy hién dat cac quân hậu bắt đầu từ dòng 1t] cho đên khi đặt được 8 quân hậu và dừng khi không còn cách đặt nào khác
Các hàm LayMau, ktdh, KhoiTao, SauDatHau, VeBanCo, VeHau không chú trọng về giải thuật nên ta chỉ đi sâu vào các hàm DatQuanHau va ham Try
1 Hàm LayMau
Hàm định nghĩa đề lẫy màu sử dụng trong màn hình thực thi Với ¡ có giá trị từ
0 đên I5 là thang màu trong hệ thông
Vi du: Goi LayMau(15) dé lay màu trắng
2 Ham ktdh
Khởi tạo đồ họa đề sử dung duoc man hinh Windows BGI
Mục đích của việc khởi động đồ họa là xác định thiết bị đồ họa (mh) và mốt đồ
họa (mode) sẽ sử dụng trong chương trình
3 Hàm KhoiTao
Hiển thị các tiêu đề: Tên trường, tên khoa, tên đề tài niên luận, học kỳ, năm học,
sinh viên thực hiện, giáo viên hướng dân, mô tả bài toán
Khởi tạo những giá trị ban đầu: Giá trị ban đầu cho cac mang Cotf[i], CheoCongf[i], CheoTru[i] có giá trị la 1 (nghia là chưa bị không chế) Giá trị ban dau cho mang ViTri[i] la -1 (nghia la chưa xác định được vi tri)