Đây là lựa chọn tối ưu để tạo nên góc nhìn trực quan.Cùng với thuật toán quay lui và đệ quy, 2 thuật toán cơ bản đã được học và tìm hiểu,báo cáo này sẽ thể hiện, mô tả, giải đáp và kết l
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CÔNG NGHỆ THÔNG TIN
MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN
ĐỒ HỌA
Giảng viên hướng dẫn: ThS Đoàn Vũ Thịnh
Sinh viên thực hiện: Lê Hoàng Nam
Mã số sinh viên: 61133986
Khánh Hòa - 2021
Trang 2TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN HỆ THỐNG THÔNG TIN
MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN
Trang 3TRƯỜNG ĐẠI HỌC NHA TRANG Khoa: Công nghệ Thông tin
PHIẾU THEO DÕI TIẾN ĐỘ VÀ ĐÁNH GIÁ BÁO CÁO THỰC TẬP CƠ
SỞ Tên đề tài: MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN ĐỒ
HỌA
Giảng viên hướng dẫn: ThS Đoàn Vũ Thịnh Sinh viên được hướng dẫn: Lê Hoàng Nam MSSV: 61133986
Trang 45 11/01/2021
6 18/1/2021
Nhận xét chung (sau khi sinh viên hoàn thành ĐA/KL):
Điểm hình thưc: …./10 Điểm nội dung: … /10 Điểm tổng kết: … /10
Đồng ý cho sinh viên: Được bảo vệ: Không được bảo vệ:
Khánh Hòa, ngày 20 tháng 01 năm 2021
Cán bộ hướng dẫn
(Ký và ghi rõ họ tên)
Trang 5MỤC LỤC
TÓM TẮT
1 GIỚI THIỆU
1.1Bài toán 8 quân hậu:
1.2Đệ quy:
1.3Thuật toán quay lui:
1.4Visual Studio Code và thư viện Graphics:
2 PHƯƠNG PHÁP NGHIÊN CỨU
2.1Cài đặt Visual Studio Code và thư viện graphics.h:
2.2Sử dụng thuật toán quay lui giải bài toán:
2.3Các hàm khác trong chương trình:
2.4Hàm floodfill và cách xác định vị trí quân cờ trên bàn cờ:
2.5Hàm main:
3 KẾT QUẢ
4 KẾT LUẬN
5 TÀI LIỆU THAM KHẢO
Trang 6TÓM TẮT
Bài toán 8 quân hậu là một trong những bài toán logic kinh điển từ giữa thế kỷXIX Sau được tổng quát và biết đến nhiều hơn với cách gọi bài toán xếp hậu (bài toánxếp n quân hậu trên bàn cờ n×n) Ở dạng tổng quát này, ta có thể tìm ra hàng tỷ cáchgiải với điều kiện n đủ lớn Đây là bài toán có thể ứng dụng trong nhiều mục đích nhưgiải trí và học tập Việc giải bài toán với mô tả theo cách trực quan sẽ đem đến cái nhìnsâu hơn về bài toán cũng như thuật toán đã cài đặt để giải bài toán này
Sử dụng đồ họa máy tính, một lĩnh vực của Công Nghệ Thông Tin dùng đểnghiên cứu về cơ sở toán học, thuật toán và các kĩ thuật tạo, hiển thị, sử dụng hình ảnhđược hiển thị trên máy tính Đây là lựa chọn tối ưu để tạo nên góc nhìn trực quan.Cùng với thuật toán quay lui và đệ quy, 2 thuật toán cơ bản đã được học và tìm hiểu,báo cáo này sẽ thể hiện, mô tả, giải đáp và kết luận toàn bộ quá trình giải bài toán 8quân hậu trên máy tính
Thông qua bài báo cáo, người đọc có thể xác định được ý tưởng về cách giải bàitoán 8 quân hậu, quy luật cũng như các quy ước khi giải bài Biết được cách cài đặtVisual Studio Code và thư viện đồ họa Quan trọng nhất, người đọc sẽ có được cáinhìn tổng quan về thuật toán quay lui và đệ quy, hiểu được cách thuật toán được sửdụng ra sao để giải bài toán 8 quân hậu Cùng với đó là các thông tin liên quan đến đồhọa, các hàm có trong thư viện
Trang 71 GIỚI THIỆU
1.1 Bài toán 8 quân hậu:
Bài toán 8 quân hậu được đưa ra vào năm 1848 bởi kỳ thủ Max Bezzel Bàitoán yêu cầu sắp xếp 8 quân hậu (hoặc n quân hậu dưới dạng bài toán xếp hậu tổngquát) trên bàn cờ kích thước 8×8 (hoặc n×n dưới dạng bài toán xếp hậu tổng quát) Saocho không có bất kì quân hậu nào có thể “ăn” được các quân hậu khác bằng cách dichuyển chính nó theo luật của cờ vua
Minh họa lời giải bài toán 8 quân hậu
Hình trên là thể hiện của 1 lời giải 8 quân hậu trong đó bàn cờ được thể hiệnbằng hình vuông đen viền trắng và các ô cờ được thể hiện bằng 64 hình vuông viềntrắng bên trong bàn cờ Các ô cờ được tô màu xanh lá cây thể hiện lần lượt vị trí của 8
ô cờ có thể đặt quân hậu thỏa mãn yêu cầu bài toán
Một trong số các lời giải bằng số học có dạng dãy số:
1,5,8,6,3,7,2,4
Đánh số thứ tự các phần tử trong dãy từ 1 đến 8
Số thứ tựDãy số
Các chỉ số dòng cột được đánh số từ trên xuống dưới, từ trái sang phải theocách đánh số của ma trận Mỗi số thứ tự được xem là chỉ số cột của vị trí ô cờ mà quânhậu sẽ đặt, mỗi số trong dãy sẽ là chỉ số dòng của ô cờ mà quân hậu sẽ đặt Từ đó, kýhiệu quân hậu nằm trên ô thứ j đứng ở cột thứ i là Q[i,j], ta có thể hiểu dãy số trên làcác vị trí: (1,1), (2,5), (3,8), (4,6), (5,3), (6,7), (7,2), (8,4)
1.2 Đệ quy:
Theo Wikipedia, 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
Trang 8í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.
Trong lập trình, có thể hiểu đơn giản, nếu trong quá trình chạy chương trình con(hàm, thủ tục), nếu chương trình con (hàm, thủ tục) này gọi lại chính nó thì có thểđược gọi là đệ quy
Với bài toán 8 quân hậu này, đệ quy sẽ chỉ được dùng như cơ sở của thuật toánquay lui
1.3 Thuật toán quay lui:
Quay lui là một thuật toán phát triển dựa trên đệ quy, thường xuyên được dùng
để giải các bài toán thõa mãn ràng buộc (Các bài toán thỏa mãn ràng buộc là các bàitoán có một lời giải đầy đủ, trong đó thứ tự của các phần tử không quan trọng Các bàitoán này bao gồm một tập các biến mà mỗi biến cần được gán một giá trị tùy theo cácràng buộc cụ thể của bài toán) Việc quay lui giúp ta có thể thử tất cả các tổ hợp để tìm
ra tất cả lời giải Rất phù hợp cho các bài toán như bài toán 8 quân hậu
Ví dụ về trường hợp quay lui:
Xét các ô cờ trên cột chưa xét tiếp theo (cột thứ 7) ta thấy tất cả các ô trên cộtđều không thỏa yêu cầu bài toán 8 quân hậu:
Minh họa ví dụ về quay lui trong bài toán 8 quân hậu
Lúc này thuật toán sẽ quay lui và tiếp tục xét các ô cờ khả thi của cột 6 (ô thứ 6,
7, 8)
1.4 Visual Studio Code và thư viện Graphics:
Theo Wikipedia (https://vi.wikipedia.org/wiki/Visual_Studio_Code) Visual
Studio Code là một trình biên tập mã được phát triển bởi Microsoft dành
Trang 9cho Windows, Linux và macOS Nó dựa trên Electron, một nền tảng được sử dụng đểtriển khai các ứng dụng Node.js máy tính cá nhân chạy trên động cơ bố trí Blink Mặc
dù sử dụng nền tảng Electron[5] nhưng phần mềm này không phải là một bản khác củaAtom, nó thực ra được dựa trên trình biên tập của Visual Studio Online
Visual Studio Code được công bố, ra mắt phiên bản thử nghiệm vào ngày 29tháng 4 năm 2015 bởi Microsoft tại hội nghị Build 2015 Vào ngày 14 tháng 4 năm
2016 Visual Studio Code hoàn tất thử nghiệm và được phát hành chính thức
Visual Studio Code là một trình biên tập mã Nó hỗ trợ nhiều ngôn ngữ và chứcnăng tùy vào ngôn ngữ sử dụng theo như trong bảng sau Nhiều chức năng của VisualStudio Code không hiển thị ra trong các menu tùy chọn hay giao diện người dùng.Thay vào đó, chúng được gọi thông qua khung nhập lệnh hoặc qua một tập tin json (ví
dụ như tập tin tùy chỉnh của người dùng) Khung nhập lệnh là một giao diện theo dònglệnh Tuy nhiên, nó biến mất khi người dùng nhấp bất cứ nơi nào khác, hoặc nhấn tổhợp phím để tương tác với một cái gì đó ở bên ngoài đó Tương tự như vậy với nhữngdòng lệnh tốn nhiều thời gian để xử lý Khi thực hiện những điều trên thì quá trình xử
lý dòng lệnh đó sẽ bị hủy
Thư viện Graphics.h (Borland Graphics Interface – còn được biết đến với têngọi BGI) là một thư viện đồ họa rất phổ biến trên DOS và các máy tính chạy hệ điềuhành Windows thời kì đầu như Windows 95, Windows 98
Thư viện này cung cấp cho người dùng 2 file: graphics.h và graphics.lib để cóthể sử dụng được với ngôn ngữ C/C++ cũng như module graph nếu người dùng sửdụng ngôn ngữ Pascal Bộ thư viện này đi kèm với IDE Borland C++ 3.1 (1992) Nóchứa một số hàm vẽ ảnh và cách tạo ảnh chuyển động, in chữ
Một trong những điểm mạnh của thư viện này là việc khởi tạo cũng như sử dụngrất đơn giản, vì vậy mặc dù ra đời rất lâu nhưng hiện tại vẫn có rất nhiều trường đạihọc sử dụng cho mục đích giảng dạy
Thư viện winbmin Đồ họa C sử dụng các hàm WinBGIm (Windows 7) có thể
được sử dụng để vẽ các hình dạng khác nhau, hiển thị văn bản trong các phông chữkhác nhau, thay đổi màu sắc và nhiều hơn nữa Thư viện winbgim cho phép bạn sửdụng các thói quen đồ họa BGI và hỗ trợ chuột đơn giản cho các ứng dụng Windows
mà bạn viết bằng trình biên dịch mingw32 gnu C ++ của CS1300 hoặc với trình biêndịch Borland C ++ (phiên bản 5.0) Nó cũng có thể hoạt động với các trình biên dịchWindows khác
Trang 102 PHƯƠNG PHÁP NGHIÊN CỨU 2.1 Cài đặt Visual Studio Code và thư viện graphics.h:
Để cài đặt Visual Studio Code bản 2019 về máy, vào đường dẫn:
(https://visualstudio.microsoft.com/download)
Tiến hành tải và cài đặt theo hướng dẫn tại đường dẫn:
visual-studio-2019)
(https://github.com/thinhdoanvu/ComputerGraphics/tree/master/Coding/library)
Không như cách cài Graphics cho DevC, để sử dụng thư viện Graphics trên
Visual Studio Code bạn cần cài đặt thêm TDM-GCC theo đường dẫn:
(https://jmeubank.github.io/tdm-gcc), và thiết lập Visual Studio Code theo hướng dẫntại: (https://www.youtube.com/watch?v=J0_vt-7Ok6U)
Bạn cũng có thể thay thế Visual Studio Code bằng phần mềm DevC và thựchiện cài đặt thư viện đồ họa theo 5 bước:
Bước 1: Copy tập tin 6-ConsoleAppGraphics, ConsoleApp_cpp_graph đến
đường dẫn C:\Program Files\Dev-Cpp\Templates
Bước 2: Copy tập tin graphics, winbgim đến thư mục C:\Program
Thiết lập phiên bản TDM-GCC phù hợp với DevC/C++ phiên bản 32 bit
Trang 11Bước 5: Tạo mới dự án (Project) đồ họa sử dụng thư viện graphics.h theo các bước sau: File New Project Console Graphics Application với tên project được đánh
dấu bởi vùng màu đỏ (Hình 2)
Thiết lập project khởi động đồ họa sử dụng thư viện graphics.h
Dưới đây là một đoạn code minh họa trong đồ họa
Code minh họa trong đồ họa
Code sau khi chạy:
Chương trình chạy minh họa
Trang 122.2 Sử dụng thuật toán quay lui giải bài toán:
2.2.1 Tạo các biến chuẩn bị cho cài đặt thuật toán:
Trước khi sử dụng giải thuật để giải bài toán Sử dụng các biến mảng có kiểu
dữ liệu Boolean để lưu các trạng thái các hàng và đường chéo Từ đó sử dụng các dữliệu này để biết được các hàng, đường chéo đã có quân hậu hay chưa
Đầu tiên, nếu các chỉ số dòng, cột được đánh số từ trên xuống dưới, từ trái sangphải theo cách đánh số của ma trận Thì ta có thể thấy các tính chất:
Quy ước giá trị False của phần tử thứ n biểu thị trạng thái chưa có quân hậu trên hàng hoặc đường chéo thứ n Ví dụ: phần tử hang[8] có giá trị False biểu thị hàng thứ 8
chưa có bất kì ô cờ nào đã đặt quân hậu Tiếp tục tạo biến mảng để lưu kết quả:
Cuối cùng ta khởi tạo giá trị toàn bộ các biến mảng này là False tại hàm main(),
biểu trị bàn cờ trống:
Trang 132.2.2 Cài đặt thuật toán quay lui và đệ quy:
Tạo hàm quay lui tên giai() với tham số truyền vào là số thứ tự của cột:
Với tham số này, thuật toán sẽ xét lần lượt các cột và không cần biến mảng để ghi trạng thái của các cột
Bắt đầu cài đặt thuật toán, đầu tiên tạo vòng lập for với biến đếm j = 1 biểu thị cho hàng đang xét, cùng biểu thức điều kiện j bé hơn hoặc bằng số hàng trong bàn cờ:
Trong vòng lập for tạo câu lệnh điều kiện để xét vị trí ô cờ đó có nằm trên hàng,đường chéo cộng, đường chéo trừ nào đã được đặt quân hậu hay chưa
Trường hợp thỏa điềề̀u kiện (có quân cờ cùng hàng hoặc cùng đường chéo): Lưu kết quả và gán giá trị True để biểu thị hàng, đường chéo cộng, đường chéo trừ đang
xét hiện tại đã được đặt quân hậu Sau đó tô màu vàng ô cờ bằng hàm
floodfill() nhằm biểu thị ô cờ đã được đặt quân hậu và dung hàm delay để thể quá
trình giải của thuật toán:
Tiếp tục sử dụng câu lệnh điều kiện nếu cột đã xét là cột cuối của bàn cờ thì tôxanh các ô cờ đã tô vàng (tô dựa theo các giá trị đúng gán trong mảng ketqua đã khai
báo) Dùng hàm getch() để giữ màn hình hiển thị kết quả cho người dùng Tô vàng các
ô theo cách tô xanh kết quả để tiếp tục xét các trường hợp kế tiếp Trong trường hợp
Trang 14không thỏa điều kiện (chưa xét đến cột cuối của bàn cờ), đệ quy hàm giai() để tiếp tục
xét các cột kết tiếp:
Kế đến gán giá trị phần tử trong mảng hàng, đường chéo cộng, đường chéo trừ
chứa ô đang xét thành False:
tô đen ô cờ để thể hiện bỏ chọn ô cờ đang xét:
Trường hợp không thỏa điềề̀u kiện (không có quân hậu cùng hàng và đường chéo):
Tô màu đỏ, sau khi delay 1 khoảng thời gian nhất định, tô đen ô cờ, điều nàykhi hiển thị trên màn hình thể hiện ô cờ đang xét đã không thỏa mãn yêu cầu bài toán
đã đặt ra:
Trang 152.2.3 Toàn bộ thuật toán quay lui:
2.3 Các hàm khác trong chương trình:
2.3.1 Hàm vebanco (vẽ bàn cờ):
Hàm vẽ bàn cờ sử dụng các hàm có sẵn trong thư viện graphics.h để vẽ bàn cờ.Bàn cờ vẽ trên màn hình đồ họa có độ lớn 400×400 pixel, có 2 đỉnh có tọa độ là(10;10) và (410;410) Các ô cờ có độ lớn 50×50 pixel, tất cả được thể hiện bằng các
đường thẳng trắng Hàm sẽ được gọi trong hàm main() trước khi gọi hàm giai().
Trang 16(450;350) và (600;400) Hàm sẽ được gọi trong hàm main() trước hoặc sau khi vẽ bàn
cờ
Trong khi đó, hàm ktramenu() sẽ kiểm tra xem người dùng có click chuột trong lúc sử dụng chương trình không Hàm sẽ được gọi trong vòng lặp for của hàm
Trang 17giai() (mỗi khi xét các ô mới trong bàn cờ sẽ đồng thời xét xem có thao tác click chuột
hay không) Khai báo các biến để lưu tọa độ nhấp chuột là mx và my sau dùng hàm
getmouseclick() để gán hoành độ x của click chuột cho mx và tung độ y của click
chuột cho my
Nếu có, tùy theo vị trí tọa độ nhấp chuột trong màn hình đồ họa nằm trong ô tùychọn nào của menu mà sẽ có các lệnh khác nhau như tăng tốc, giảm tốc hoặc thoát.Ngược lại nếu người dùng không click chuột hoặc click chuột vào tọa độ không nằmtrong bất kì ô tùy chọn nào của menu, câu lệnh sẽ được bỏ qua
Với tùy chọn × toc do hoặc / toc do Ta khai báo biến tocdo với giá trị 400 và truyền vào các hàm delay() trong hàm giai() để thể hiện quá trình giải cho mắt thường
có thể theo dõi Nếu người dùng chọn × toc do ta gán tocdo = tocdo/2, nếu là / tocdo
ta gán tocdo = tocdo×2 Đồng thời phải đặt điều kiện cho giá trị tốc độ trước khi gán
giá trị để tránh trường hợp biến tocdo bị chia lấy nguyên về giá trị 0 hoặc thời gian delay() quá lớn (ở đây đặt tocdo phải trên 10 và dưới 4000 tương đương 0.01 giây và 4
giây)
2.4 Hàm floodfill và cách xác định vị trí quân cờ trên bàn cờ:
Hàm floodfill() là hàm có sẵn của thư viện graphics.h, cho phép tô màu các
pixel xung quanh tọa độ chỉ định có giá trị màu bằng hoặc chênh lệch 1 khoảng giá trị
cho phép với pixel ở tọa độ đó Sử dụng hàm floodfill() ta sẽ tô các ô cờ theo quy ước
các ô cờ đang xét thỏa điều kiện màu vàng, các ô cờ đang xét không thỏa điều kiệnmàu đỏ, các ô cờ đã xét và tạo thành 1 lời giải màu xanh lá cây
Tuy nhiên, để tô màu các ô cờ ta phải xác định tọa độ để truyền vào hàm như 1tham số Với bàn cờ tạo từ 2 đỉnh đối nhau là (10;10) và (410;410), độ lớn là 400×400pixel, cùng các ô cờ lớn 50×50 pixel, ta dùng các chỉ số hàng và cột có sẵn để tạo
thành công thức tính tọa độ tô màu ô cờ thuộc cột i hàng j:
x = (i-1) × 50 + a và y = (j-1) × 50 + b Với a,b ∈ (0;50)
15
Trang 18Ví dụ sử dụng hàm floodfill() trong việc tô ô cờ:
2.5 Hàm main:
Vì là chương trình sử dụng thư viện đồ họa, cần sử dụng các hàm để khởi độngchế độ đồ họa Chương trình nếu không gặp lỗi sẽ chạy bình thường, ngược lại sẽthông báo lỗi không thể khởi động đồ họa cùng với mã lỗi và nguyên nhân
Gán các giá trị cho các mảng như đã trình bày và gọi các hàm đã tạo sau đó gọi
hàm giai() để giải bài toán.
Trang 193 KẾT QUẢ
Sau khi chạy chương trình, kết quả thu được các lời giải sau cho bài toán 8 quânhậu:
Trang 22Số lượng lời giải thu được là 92, bằng với thống kê về số lượng lời giải bài toán
8 quân hậu có được từ trang bách khoa toàn thư điện tử Wikipedia Các lời giải không
trùng nhau và thỏa mãn yêu cầu bài toán