You are on page 1of 26

BỘ 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


TRƯỜ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
ĐỒ 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 - Tháng 12/2021


TRƯỜ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
Khóa: 61 Ngành: Công nghệ Thông tin
Lần Ngày Nội dung Nhận xét của GVHD
1 7/12/2020 Nhận đề tài hướng dẫn và định Sinh viên và GVHD trao
hướng giải quyết vấn đề. Sinh đổi nội dung của đề tài.
viên trình bày kế hoạch thực Phân chia công việc theo
hiện. từng thời gian sao cho phù
hợp với yêu cầu.
2 14/12/2020 Sinh viên trình bày việc mô Sinh viên hiểu được vấn đề
phỏng thuật toán chính dựa cần phải thực hiện và có
trên kiến thức đã được học ở giải pháp cho từng vấn đề
môn kỹ thuật đồ họa và các cụ thể. Tuy nhiên trình bày
kiến thức thu nhận được từ còn thiếu sót và cần đầu tư
Internet để minh họa bài toán thời gian hơn cho thuật
đa dạng nhất có thể. toán.
3 21/12/2020 Sinh viên hoàn thiện các thuật Sinh viên hiểu nội dung của
toán đã đề ra với dữ liệu đầu thuật toán với các trường
vào được nhập từ bàn phím. hợp hạn chế của thuật toán
Trình bày thuật toán với các nhưng chưa đủ. Các chức
trường hợp sai và chỉ ra được năng khác phụ trợ cho việc
hướng khắc phục cho các minh họa bài toán đã hoàn
trường hợp đó. thành.
4 4/01/2021 Sinh viên nộp bản thảo của báo Báo cáo chỉ trình bày chung
cáo thực tập lần thứ 1 và tiến chung chưa đi vào cụ thể
hành chỉnh sửa. phân tích các yêu cầu của
bài toán, hình ảnh, bảng
biểu chưa trình bày rõ ràng.
Cần hiệu chỉnh theo yêu

1
cầu của GVHD.
5 11/01/2021 Sinh viên nộp bản thảo lần 2 Sinh viên nộp bản thảo lần
và tiến hành chỉnh sửa. 2. Đã tìm hiểu thuật toán
đầy đủ.
Sinh viên nộp bản thảo lần Sinh viên nghiêm túc chỉnh
6 18/1/2021 cuối sau khi đã chỉnh sửa các sửa báo cáo theo định
yêu cầu như đã đề ra. hướng của GVHD.

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)

2
MỤC LỤC

TÓM TẮT.................................................................................................................... 4
1. GIỚI THIỆU........................................................................................................5
1.1 Bài toán 8 quân hậu:............................................................................................5
1.2 Đệ quy:................................................................................................................5
1.3 Thuật toán quay lui:.............................................................................................6
1.4 Visual Studio Code và thư viện Graphics:...........................................................6
2. PHƯƠNG PHÁP NGHIÊN CỨU.......................................................................8
2.1 Cài đặt Visual Studio Code và thư viện graphics.h:............................................8
2.2 Sử dụng thuật toán quay lui giải bài toán:..........................................................10
2.2.1 Tạo các biến chuẩn bị cho cài đặt thuật toán:...................................10
2.2.2 Cài đặt thuật toán quay lui và đệ quy:..............................................10
2.2.3 Toàn bộ thuật toán quay lui:.............................................................13
2.3 Các hàm khác trong chương trình:.....................................................................13
2.3.1 Hàm vebanco (vẽ bàn cờ):................................................................13
2.3.2 Hàm menu và ktramenu:..................................................................14
2.4 Hàm floodfill và cách xác định vị trí quân cờ trên bàn cờ:................................15
2.5 Hàm main:.........................................................................................................16
3. KẾT QUẢ...........................................................................................................17
4. KẾT LUẬN.........................................................................................................23
5. TÀI LIỆU THAM KHẢO.................................................................................24

3
TÓ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án
xế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ách
giả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ìn sâ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 8
quâ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ài
toá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 đặt
Visual Studio Code và thư viện đồ họa. Quan trọng nhất, người đọc sẽ có được cái
nhì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.

4
1. 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ài
toá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ổng
quá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). Sao
cho 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 di
chuyể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ện
bằ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ền
trắ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ự 1 2 3 4 5 6 7 8
Dãy số 1 5 8 6 3 7 2 4

Các chỉ số dòng cột được đánh số từ trên xuống dưới, từ trái sang phải theo
cá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ân
hậ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
5
í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án
quay 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ài
toá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ài
toá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ác
rà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

6
cho 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ủa Atom, 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 29
thá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ức
nă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 Visual
Studio 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òng
lệ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ững
dò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ên
gọ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ều
hà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ụng
rấ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 đại
họ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ên
dị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ịch
Windows khác.

7
2. 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:
(https://duythanhcse.wordpress.com/2019/04/03/huong-dan-tai-cai-dat-va-su-dung-
visual-studio-2019).
Cài đặt Graphics theo đường link:
(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ẫn
tạ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ực
hiệ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 Files\Dev-
Cpp\MinGW64\x86_64-w64-mingw32\include
Bước 3: Copy tập tin libbgi.a đến đường dẫn C:\Program Files\Dev-Cpp\
MinGW64\x86_64-w64-mingw32\lib
Bước 4: Hiệu chỉnh phiên bản TDM-GCC cho phù hợp với hệ điều hành trong
phần mềm DevC/C++ theo đường dẫn sau: Tools - Compiler Option ta chọn TDM-
GCC 4.9.2 32bit Release

Thiết lập phiên bản TDM-GCC phù hợp với DevC/C++ phiên bản 32 bit

8
Bướ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

9
2.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 sang
phải theo cách đánh số của ma trận. Thì ta có thể thấy các tính chất:
 các phần tử nằm trên cùng hàng có chỉ số hàng bằng nhau.
 các phần tử nằm trên cùng cột có chỉ số cột bằng nhau.
 các phần tử nằm trên cùng một đường chéo song song với đường chéo
chính có hiệu chỉ số hàng với chỉ số cột bằng nhau.
 các phần tử nằm trên cùng một đường chéo song song với đường chéo
phụ có tổng chỉ số hàng với chỉ số cột bằng nhau.
Quy ước các đường chéo song song với đường chéo chính là đường chéo trừ,
các đường chéo song song với đường chéo phụ là đường chéo cộng, khai báo các
mảng ghi trạng thái như sau:

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:

10
2.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

11
khô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ày
khi 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:

12
2.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().

13
2.3.2 Hàm menu và ktramenu:
Hàm menu thể hiện các tùy chọn tốc độ hoặc thoát ứng dụng cho người dùng
thông qua nhấp chuột. Hàm menu sẽ vẽ các tùy chọn thành ô cùng với chữ trong ô để

người dùng có thể chọn. Trong đó sẽ có 3 ô chữ nhật ứng với 3 ô từ trên xuống là tăng
tốc độ lên 2 lần, giảm tốc độ xuống 2 lần và thoát. Mỗi ô sẽ có độ lớn 150 ×100 pixel.
Các ô lần lượt có các cặp đỉnh: (450;100) và (600;150), (450;150) và (600;200),
(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

14
giai() (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ùy
chọ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ằm
trong 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ện
mà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ư 1
tham số. Với bàn cờ tạo từ 2 đỉnh đối nhau là (10;10) và (410;410), độ lớn là 400 ×400
pixel, 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
Ví 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 động
chế độ đồ 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.

16
3. 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ân
hậu:

17
18
19
Số 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.

20
Quá trình mô tả giải bài toán đã có thể mô tả trực quan, khiến quá trình giải bài
toán 8 quân hậu bằng thuật toán quay lui và đệ quy có thể dễ dàng theo dõi hơn trước.

Minh họa mô tả quá trình giải bài toán Minh họa lời giải được hiển thị bằng
bằng quay lui và đệ quy thư viện đồ họa

Các ô cờ đặt quân hậu đang xét, đúng, sai được minh họa bằng các màu vàng,
xanh đỏ giúp mô tả bài toán.
Các tùy chọn tăng giảm tốc độ giúp người dùng dễ dàng theo dõi với tốc độ
mong muốn và không xảy ra bất kì lỗi nào.

Minh họa chương trình khi xuất hiện lời giải đầu tiên

21
Minh họa chương trình khi đang giải bài toán

22
4. KẾT LUẬN

Sau khi hoàn thành báo cáo nhận thấy các ưu nhược điểm của thuật toán quay
lui đệ quy cùng với chương trình Visual Studio Code so với các thuật toán và chương
trình khác:
Ưu điểm của thuật toán quay lui và đệ quy:
- Dễ cài đặt thuật toán.
- Cho kết quả chính xác.
- Có thể áp dụng với bài toán xếp hậu (dạng tổng quát của bài toán 8 quân
hậu).
Nhược điểm của thuật toán:
- Cần xét đến mọi trường hợp nên thời gian giải chậm.
- Không thể dùng với các bài toán xếp hậu nếu số quân hậu quá nhiều vì thời
gian giải quá lâu.
Ưu điểm của Visual Studio Code:
- Môi trường lập trình chuyên nghiệp.
- Có nhiều extension (các chương trình hỗ trợ tích hợp) cho phép lập trình dễ
dàng hơn.
Nhược điểm của Visual Studio Code:
- Khó cài đặt để sử dụng.
- Việc cài đặt thư viện đồ họa khá khó khăn so với Dev C hoặc các chương
trình khác.
- Không hỗ trợ sẵn biên dịch các chương trình đồ họa.

23
5. TÀI LIỆU THAM KHẢO

https://github.com/thinhdoanvu/ComputerGraphics/tree/master/Coding/library
https://vi.wikipedia.org/wiki/Visual_Studio_Code
https://duythanhcse.wordpress.com/2019/04/03/huong-dan-tai-cai-dat-va-su-
dung-visual-studio-2019
https://www.youtube.com/watch?v=J0_vt-7Ok6U

24

You might also like