Tải bản đầy đủ (.pdf) (59 trang)

Tổ chức dữ liệu cho các thuật toán quay lui

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 (882.07 KB, 59 trang )


Số hóa bởi Trung tâm Học liệu
/>
ĐẠI HỌC THÁI NGUN
TRƢỜNG ĐẠI HỌC CƠNG NGHỆ THƠNG TIN VÀ TRUYỀN THƠNG




NGUYỄN QUANG TRÌNH




TỔ CHỨC DỮ LIỆU
CHO LỚP CÁC THUẬT TỐN QUAY LUI





LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH










THÁI NGUN - 2013


Số hóa bởi Trung tâm Học liệu
/>
ĐẠI HỌC THÁI NGUN
TRƢỜNG ĐẠI HỌC CƠNG NGHỆ THƠNG TIN VÀ TRUYỀN THƠNG




NGUYỄN QUANG TRÌNH




TỔ CHỨC DỮ LIỆU
CHO LỚP CÁC THUẬT TỐN QUAY LUI

Chun ngành: Khoa học máy tính
Mã số: 60 48 01


LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH



Ngƣời hƣớng dẫn khoa học: PGS.TSKH Nguyễn Xn Huy







THÁI NGUN - 2013





Số hóa bởi Trung tâm Học liệu
/>
i
LỜI CAM ĐOAN

Học viên xin cam đoan, kết quả của luận văn hồn tồn là kết quả của
tự bản thân học viên tìm hiểu, nghiên cứu và thực hiện theo sự hƣớng dẫn
khoa học của PGS.TSKH. Nguyễn Xn Huy.
Các tài liệu tham khảo đƣợc trích dẫn và chú thích đầy đủ.

Thái Ngun, ngày 10 tháng 10 năm 2013
Học viên



Nguyễn Quang Trình
















Số hóa bởi Trung tâm Học liệu
/>
ii
LỜI CẢM ƠN

Học viên xin đƣợc bày tỏ lòng biết ơn chân thành và sâu sắc nhất đến
thầy giáo PGS.TSKH. Nguyễn Xn Huy, ngƣời đã tận tình hƣớng dẫn và tạo
mọi điều kiện tốt nhất để học viên có thể hồn thành luận văn này.
Xin chân thành cảm ơn các thầy giáo, cơ giáo Trƣờng Đại học Cơng
nghệ thơng tin và Truyền thơng - Đại học Thái Ngun, Viện Cơng nghệ
Thơng tin - Viện Khoa học và Cơng nghệ Việt Nam đã trực tiếp giảng dạy,
giúp đỡ và tạo mọi điều kiện thuận lợi trong q trình học tập và nghiên cứu.
Cảm ơn các thầy cơ giáo, các bạn học viên lớp cao học Khoa học máy
tính CK10C, gia đình và các đồng nghiệp đã ln quan tâm, hỗ trợ, khuyến
khích trong suốt thời gian học tập và thực hiện đề tài.
Xin chân thành cám ơn!
Học viên




Nguyễn Quang Trình

Số hóa bởi Trung tâm Học liệu
/>
iii
MỤC LỤC

TRANG BÌA
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
MỤC LỤC iii
DANH MỤC CÁC HÌNH v
MỞ ĐẦU 1
1. Lí do chọn đề tài 1
2. Đối tƣợng và phạm vi nghiên cứu 1
3. Hƣớng nghiên cứu của đề tài 1
4. Những nội dung nghiên cứu chính 1
5. Phƣơng pháp nghiên cứu 2
6. Ý nghĩa khoa học của đề tài 2
Chƣơng 1. TỔNG QUAN THUẬT TỐN QUAY LUI 3
1.1. Giới thiệu chung 3
1.2. Ý tƣởng của thuật tốn [1], [2], [3], [5] 3
1.3. Kết luận 7
Chƣơng 2. XÂY DỰNG THUẬT TỐN QUAY LUI VÀ TỔ CHỨC
DỮ LIỆU CHO MỘT SỐ BÀI TỐN KINH ĐIỂN 8
2.1. Bài tốn từ chuẩn [2] 8
2.1.1. Giới thiệu bài tốn 8
2.1.2. Tổ chức dữ liệu và chƣơng trình 8
2.1.3. Nhận xét 11

2.2. Bài tốn xếp hậu [1], [2] 12
2.2.1. Giới thiệu bài tốn 12
2.2.2. Tổ chức dữ liệu và chƣơng trình 13
2.2.3. Nhận xét 20

Số hóa bởi Trung tâm Học liệu
/>
iv
2.3. Bài tốn đa giác 21
2.3.1. Giới thiệu bài tốn 21
2.3.2. Tổ chức dữ liệu và chƣơng trình 23
2.3.3. Nhận xét 29
2.4. Bài tốn ơ số Sudoku 30
2.4.1. Giới thiệu bài tốn 30
2.4.2. Tổ chức dữ liệu và chƣơng trình 32
2.4.3. Nhận xét 36
2.5. Kết luận 36
Chƣơng 3. CÀI ĐẶT CHƢƠNG TRÌNH 37
3.1. Cài đặt cho bài tốn từ chuẩn 37
3.1.1. Giới thiệu chƣơng trình 37
3.1.2. Thử nghiệm chƣơng trình 41
3.2. Cài đặt cho bài tốn xếp hậu 42
3.2.1. Giới thiệu chƣơng trình 42
3.2.2. Thử nghiệm chƣơng trình 43
3.3. Cài đặt cho bài tốn đa giác 45
3.3.1. Giới thiệu chƣơng trình 45
3.3.2. Thử nghiệm chƣơng trình 47
3.4. Cài đặt cho bài tốn ơ số Sudoku 48
3.4.1. Giới thiệu chƣơng trình 48
3.4.2. Thử nghiệm chƣơng trình 49

KẾT LUẬN 53
TÀI LIỆU THAM KHẢO 54


Số hóa bởi Trung tâm Học liệu
/>
v
DANH MỤC CÁC HÌNH

Hình 1.1 Cây tìm kiếm lời giải theo thuật tốn quay lui 7
Hình 2.1 Cây tìm kiếm lời giải cho bài tốn từ chuẩn 11
Hình 2.2 Lời giải 1 với N = 4 15
Hình 2.3 Lời giải 2 với N = 4 16
Hình 2.4 Cây lời giải bài tốn xếp hậu với N = 4 17
Hình 2.5 Các đƣờng chéo chính 18
Hình 2.6 Các đƣờng chéo phụ 18
Hình 2.7 Nghiệm v1 = (2, 4, 1, 3) 20
Hình 2.8 Trò chơi Instant Insanity 21
Hình 2.9 Đáp án đạt đƣợc sau khi xoay mỗi khối sang trái 1 góc 90
o
21
Hình 2.10 Bài tốn đa giác với m = 4, n = 6 22
Hình 2.11 Đáp án của bài tốn đa giác với m = 4, n = 6 23
Hình 2.12 Cách tìm nghiệm id = {1,5,6,3} 29
Hình 2.13 Đề bài 1 31
Hình 2.14 Đáp án đề bài 1 31
Hình 2.15 Đề bài 2 32
Hình 2.16 Đáp án đề bài 2 32
Hình 3.1 Giao diện chƣơng trình TUCHUAN 41
Hình 3.2 Tìm 1 nghiệm với n = 7 41

Hình 3.3 Tìm 1 nghiệm với n = 100 41
Hình 3.4 Tìm 1 nghiệm với n = 1000 42
Hình 3.5 Giao diện chƣơng trình XEPHAU 42
Hình 3.6 20 nghiệm đầu tiên 43
Hình 3.7 Các nghiệm 68 → 92 43
Hình 3.8 20 nghiệm đầu tiên 44

Số hóa bởi Trung tâm Học liệu
/>
vi
Hình 3.9 Các nghiệm 699 → 724 44
Hình 3.10 Chƣơng trình XEPHAU cải tiến 45
Hình 3.11 Giao diện chƣơng trình DAGIAC 46
Hình 3.12 Thử nghiệm chƣơng trình với M = 4, N = 6 47
Hình 3.13 Thử nghiệm chƣơng trình với M = 10, N = 20 47
Hình 3.14 Thử nghiệm chƣơng trình với M = 40, N = 40 48
Hình 3.15 Giao diện chƣơng trình SUDOKU 49
Hình 3.16 Đọc đề bài từ tệp input de1 50
Hình 3.17 Đáp án de1 bằng phƣơng án 1 50
Hình 3.18 Đáp án de1 bằng phƣơng án 2 51
Hình 3.19 Đọc đề bài từ tệp input de2 52
Hình 3.20 Đáp án de2 bằng phƣơng án 1 52
Hình 3.21 Đáp án de2 bằng phƣơng án 2 52



Số hóa bởi Trung tâm Học liệu
/>
1
MỞ ĐẦU

1. Lí do chọn đề tài
Để giải một bài tốn thơng thƣờng có nhiều cách tiếp cận. Mỗi cách
tiếp cận khác nhau cho kết quả với độ tối ƣu khác nhau. Với nhiều bài tốn
việc tìm ra giải thuật tối ƣu khơng phải việc đơn giản, do đó một kĩ năng cần
thiết để giải đƣợc một bài tốn hồn chỉnh là phải giải đƣợc bài tốn ở kích
thƣớc dữ liệu vừa phải. Đây sẽ là những bộ dữ liệu thử mang tính định hƣớng
chiến lƣợc cho việc giải bài tốn. Với phƣơng pháp này có thể giải ngay bằng
cách duyệt tồn bộ hoặc có thể giải đƣợc một phần lớn của bài tốn. Một
thuật tốn giúp duyệt tồn bộ hiệu quả, nhanh chóng là thuật tốn quay lui.
Việc áp dụng và cài đặt thuật tốn quay lui cho các bài tốn thƣờng khá
trừu tƣợng và khó hiểu. Và khó hơn là việc kết hợp thuật tốn quay lui với
nhánh cận để giúp q trình duyệt đƣợc hiệu quả hơn. Do đó học viên thấy
việc phân tích, đánh giá và định hƣớng cách tiếp cận một bài tốn bằng thuật
tốn quay lui là rất cần thiết.
Trong khn khổ luận văn thạc sỹ, học viên chọn đề tài nghiên cứu:
“Tổ chức dữ liệu cho lớp các thuật tốn quay lui”
2. Đối tƣợng và phạm vi nghiên cứu
Tìm hiểu một số đặc trƣng của lớp các bài tốn đòi hỏi duyệt các
khả năng.
Ứng dụng để giải một số bài tốn liệt kê và tìm phƣơng án tối ƣu.
3. Hƣớng nghiên cứu của đề tài
Tìm hiểu các kỹ thuật và quy trình duyệt dữ liệu.
Cài đặt chƣơng trình cho một số bài tốn.
4. Những nội dung nghiên cứu chính
Chƣơng 1. Tổng quan thuật tốn quay lui
Chƣơng này giới thiệu một số vấn đề liên quan đến đặc điểm, ý tƣởng
và nội dung của thuật tốn quay lui.

Số hóa bởi Trung tâm Học liệu
/>

2
Chƣơng 2. Xây dựng thuật tốn quay lui và tổ chức dữ liệu cho một
số lớp bài tốn kinh điển.
 Bài tốn từ chuẩn
 Bài tốn xếp hậu
 Bài tốn đa giác
 Bài tốn ơ số Sudoku
Chƣơng 3. Cài đặt chƣơng trình cho các bài tốn ở Chƣơng 2
và thử nghiệm.
5. Phƣơng pháp nghiên cứu
Phân tích, liệt kê, đối sánh, nghiên cứu tài liệu, tổng hợp các kết quả
của các nhà nghiên cứu liên quan đến lĩnh vực nghiên cứu.
6. Ý nghĩa khoa học của đề tài
Vận dụng tốt thuật tốn quay lui, giúp chúng ta có thể dễ dàng giải
đƣợc các bài tốn liệt kê, tối ƣu.
Xây dựng cơ sở khoa học cho các bài tốn tìm kiếm.


Số hóa bởi Trung tâm Học liệu
/>
3
Chƣơng 1
TỔNG QUAN THUẬT TỐN QUAY LUI
Chƣơng này giới thiệu một số vấn đề liên quan đến đặc điểm, ý tƣởng và
nội dung của thuật tốn quay lui.
1.1. Giới thiệu chung
Thuật tốn duyệt tồn bộ bằng cách sử dụng các vòng lặp lồng nhau có
thể áp dụng cho các bài tốn có kích thƣớc của các tập nghiệm cố định. Với
những bài tốn mà kích thƣớc của nghiệm phụ thuộc vào dữ liệu đầu vào
hoặc một số điều kiện nào khác thì việc sử dụng các vòng lặp lồng nhau là

bất khả thi. Lúc này, chỉ có thuật tốn quay lui là có thể thực hiện duyệt qua
đƣợc tất cả các bộ nghiệm của bài tốn.
Thuật tốn quay lui là chiến lƣợc tìm nghiệm bài tốn bằng cách xét tất
cả các phƣơng án có thể. Đây là một thuật tốn có thể áp dụng để giải rất
nhiều bài tốn với kích thƣớc dữ liệu thích hợp. Ƣu điểm của thuật tốn là
đảm bảo tìm ra nghiệm đúng chính xác. Tuy nhiên, hạn chế là độ phức tạp
thƣờng lớn.
Những bài tốn tìm một nghiệm, liệt kê hoặc bài tốn tối ƣu là những
lớp bài tốn có thể giải bằng thuật tốn quay lui.
1.2. Ý tƣởng của thuật tốn [1], [2], [3], [5]
Giả sử ta phải tìm trong một tập dữ liệu D cho trƣớc một dãy dữ liệu:
v = (v[1], v[2], , v[n])
thoả đồng thời hai tính chất P và Q.
Trƣớc hết ta chọn một trong hai tính chất đã cho để làm nền, tính chất
thứ hai tạm gác bỏ, giả sử ta chọn tính chất P.
Sau đó ta thực hiện các bƣớc sau đây:
Bƣớc 1. (Khởi trị) Xuất phát từ một dãy ban đầu v = (v[1], , v[i]) nào
đó của các phần tử trong D sao cho v thoả P.

Số hóa bởi Trung tâm Học liệu
/>
4
Bƣớc 2. Nếu v thoả Q ta dừng thuật tốn và thơng báo kết quả là dãy v,
ngƣợc lại ta thực hiện Bƣớc 3.
Bƣớc 3. Tìm tiếp một phần tử v[i + 1] để bổ sung cho v sao cho
v = (v[1], , v[i], v[i + 1]) thoả P.
Có thể xảy ra các trƣờng hợp sau đây:
3.1. Tìm đƣợc phần tử v[i + 1]: quay lại bƣớc 2.
3.2. Khơng tìm đƣợc v[i + 1] nhƣ vậy, tức là với mọi v[i + 1] có thể lấy
trong D, dãy v = (v[1], , v[i], v[i + 1]) khơng thoả P.

Điều này có nghĩa là đi theo đƣờng v = (v[1], , v[i]) sẽ khơng dẫn tới
kết quả. Ta phải đổi hƣớng tại một vị trí nào đó.
Để thốt khỏi ngõ cụt này, ta tìm cách thay v[i] bằng một giá trị khác
trong D.
Nói cách khác, ta loại v[i] khỏi dãy v, giảm i đi một đơn vị rồi quay lại
bƣớc 3.
Cách làm nhƣ trên đƣợc gọi là quay lui: lùi lại một bƣớc.
Dĩ nhiên ta phải đánh dấu v[i] là phần tử đã loại tại vị trí i để sau đó
khơng đặt lại phần tử đó vào vị trí i trong dãy v.
Khi nào thì có thể trả lời là khơng tồn tại dãy v thoả đồng thời hai tính
chất P và Q? Nói cách khác, khi nào thì ta có thể trả lời là bài tốn vơ
nghiệm?
Dễ thấy, bài tốn vơ nghiệm khi ta đã duyệt hết mọi khả năng. Ta nói là
đã vét cạn mọi khả năng. Chú ý rằng có thể đến một lúc nào đó ta phải lùi liên
tiếp nhiều lần. Từ đó suy ra rằng, thơng thƣờng bài tốn vơ nghiệm khi ta
khơng còn có thể lùi đƣợc nữa. Có nhiều sơ đồ giải các bài tốn quay lui, dƣới
đây là hai sơ đồ khá đơn giản, khơng đệ quy.

Số hóa bởi Trung tâm Học liệu
/>
5
Sơ đồ 1: Giải bài tốn quay lui
(tìm 1 nghiệm)
Sơ đồ 2: Giải bài tốn quay lui
(tìm 1 nghiệm)
Khởi trị v: v thoả P;
repeat
if (v thoả Q) then
begin
Ghi nhận nghiệm;

exit;
end;
if (Tìm được 1 nước đi)
then Tiến
else
if (có thể lùi được)
then Lùi
else
begin
Ghi nhận: vơ nghiệm;
exit;
end;
until false;
Khởi trị v: v thoả P;
repeat
if (v thoả Q) then
begin
Ghi nhận nghiệm;
exit;
end;
if (Hết khả năng duyệt)
then
begin
Ghi nhận vơ nghiệm;
exit;
end;
if (Tìm được 1 nước đi)
then Tiến
else Lùi;
until false;

Thơng thƣờng ta khởi trị cho v là dãy rỗng (khơng chứa phần tử nào)
hoặc dãy có một phần tử. Ta chỉ u cầu dãy v đƣợc khởi trị sao cho v thoả P.
Lƣu ý là cả dãy v thoả P chứ khơng phải từng phần tử trong v thoả P.
Có bài tốn u cầu tìm tồn bộ (mọi nghiệm) các dãy v thoả đồng thời
hai tính chất P và Q. Nếu biết cách tìm một nghiệm ta dễ dàng suy ra cách tìm
mọi nghiệm nhƣ sau: mỗi khi tìm đƣợc một nghiệm, ta thơng báo nghiệm đó
trên màn hình hoặc ghi vào một tệp rồi thực hiện thao tác Lùi, tức là giả vờ
nhƣ khơng cơng nhận nghiệm đó, do đó phải loại v[i] cuối cùng trong dãy v
để tiếp tục tìm hƣớng khác.

Số hóa bởi Trung tâm Học liệu
/>
6
Phƣơng pháp này có tên là phƣơng pháp giả sai. Hai sơ đồ trên sẽ đƣợc
sửa một chút nhƣ sau để tìm mọi nghiệm.
Sơ đồ 3: Giải bài tốn quay lui
(tìm mọi nghiệm)
Sơ đồ 4: Giải bài tốn quay lui
(tìm mọi nghiệm)
Khởi trị: v thoả P;
d := 0; {đếm số nghiệm}
repeat
if (v thoả Q) then
begin
d := d + 1;
Ghi nhận nghiệm thứ d;
Lùi; { giả sai }
end;
if (Tìm được 1 nước đi)
then Tiến

else if (có thể lùi được)
then Lùi
else { hết khả năng }
begin
if d = 0 then
Ghi nhận: vơ nghiệm;
else
Ghi nhận: d nghiệm;
exit;
end;
until false;
Khởi trị: v thoả P;
d := 0; {đếm số nghiệm}
repeat
if (v thoả Q) then
begin
d := d + 1;
Ghi nhận nghiệm thứ d;
Lùi; { giả sai }
end;
if (Hết khả năng duyệt)
then
begin
if d = 0 then
Ghi nhận: vơ nghiệm;
else
Ghi nhận: d nghiệm;
exit;
end;
if (Tìm được 1 nước đi)

then Tiến
else Lùi;
until false;


Số hóa bởi Trung tâm Học liệu
/>
7
Q trình tìm kiếm lời giải theo thuật tốn quay lui có thể mơ tả bởi cây
tìm kiếm lời giải sau đây:














Hình 1.1 Cây tìm kiếm lời giải theo thuật tốn quay lui

1.3. Kết luận
Thuật tốn quay lui, cũng nhƣ nhiều thuật tốn khác nó chỉ mang tính
định hƣớng chiến lƣợc để giải bài tốn. Đây là khơng phải là một cơng cụ siêu
việt để có thể giải tất cả các bài tốn tìm nghiệm, liệt kê hay tối ƣu. Do đó, khi

áp dụng thuật tốn, đơi khi ta phải kết hợp thêm nhiều kĩ thuật, thuật tốn
khác thì mới có thể đem lại kết quả tốt nhất.
Start
2
1
3
4
5
6
7
8

Quay lui từ
Bƣớc 4 về Bƣớc 3
Xét tiếp các khả năng
của Bƣớc 3

Số hóa bởi Trung tâm Học liệu
/>
8
Chƣơng 2
XÂY DỰNG THUẬT TỐN QUAY LUI VÀ TỔ CHỨC
DỮ LIỆU CHO MỘT SỐ BÀI TỐN KINH ĐIỂN
Chƣơng 2 sẽ trình bày cách tổ chức dữ liệu để có thế áp dụng thuật tốn
quay lui cho một số bài tốn kinh điển.
2.1. Bài tốn từ chuẩn [2]
2.1.1. Giới thiệu bài tốn
Một từ chuẩn loại M là một dãy các chữ số, mỗi chữ số nằm trong
khoảng từ 1 đến M. Số lƣợng các chữ số có mặt trong một từ đƣợc gọi là
chiều dài của từ đó.

Từ loại M đƣợc gọi là từ chuẩn nếu nó khơng chứa hai khúc (từ con)
liền nhau mà giống nhau.
Với giá trị n cho trƣớc, hiển thị trên màn hình một từ chuẩn loại 3 có
chiều dài n.
Thí dụ:
12131 là từ chuẩn loại 3, chiều dài 5.
1213123 là từ chuẩn loại 3, chiều dài 7.
1213213 khơng phải là từ chuẩn vì nó chứa liên tiếp hai từ con giống
nhau là 213.
Tƣơng tự, 12332 khơng phải là từ chuẩn vì chứa liên tiếp hai từ con
giống nhau là 3.
2.1.2. Tổ chức dữ liệu và chương trình
Ta dùng mảng v[1 n] để lƣu từ cần tìm.
Tại mỗi vị trí k ta xác định giá trị v[k] trong khoảng 1 M sao cho
v[1 k] là từ chuẩn.

Số hóa bởi Trung tâm Học liệu
/>
9
Mảng v:
1
2
3
4
5

n
1
2
1

3
1


Với k = 5, tại vị trí v[5], từ v[1 5] = “12131” là từ chuẩn.
Điều kiện P: v[1 k] là từ chuẩn.
Điều kiện Q: Dừng thuật tốn theo một trong hai tình huống sau đây:
nếu i = n thì bài tốn có nghiệm v[1 n].
nếu i = 0 thì bài tốn vơ nghiệm.
Duyệt các giá trị tại vị trí v[k] của từ v[1 k] bắt đầu từ v[k] + 1 đến
M (M = 3) sao cho v[1 k] là từ chuẩn.
CoNuocDi = true nếu tồn tại 1 giá trị v[k] nhƣ vậy.
Ngƣợc lại, nếu với mọi v[k] = v[k] + 1 đến M, từ v[1 k] đều khơng
chuẩn thì CoNuocDi = false.
// Tai vi tri k xac dinh duoc 1 gia tri
// thoa v[1 k] la tu chuan
bool CoNuocDi(int k)
{
for (int i = v[k]+1; i <= 3; ++i) {
v[k] = i;
if (Chuan(k)) return true;
}
return false;
}
Để kiểm tra tính chuẩn của từ v[1 k], ta lƣu ý rằng từ v[1 k-1] đã chuẩn
(tính chất P), do đó chỉ cần kiếm tra các cặp từ có chứa v[k], cụ thể là khảo sát
các cặp từ có chiều dài k đứng cuối từ v.
// Xac dinh v[1 k] la tu chuan
bool Chuan(int k)
{


Số hóa bởi Trung tâm Học liệu
/>
10
int k2 = k/2;
for (int j = 1; j <= k2; ++j)
if (Bang(k,j)) return false;
return true;
}
Đó là các cặp từ v[(k-d-d+1) (k-d)] và v[k-d+1 k] với d = 1 (k/2). Nếu
với mọi d nhƣ vậy hai từ đều khác nhau thì v[1 k] là từ chuẩn. Ngƣợc lại,
v[1 k] khơng phải từ chuẩn.
Hàm Bang(k,d) kiểm tra xem hai từ kề nhau chiều dài d tính từ k trở
về trƣớc có bằng nhau hay khơng.
Hai từ đƣợc xem là khác nhau nếu chúng khác nhau tại một vị trí
nào đó.
// ? v[k-d-d+1 k-d] = v[k-d+1 k]
bool Bang(int k, int d) {
int i;
for (i = 0; i < d; ++i)
if (v[k-i] != v[k-d-i]) return false;
return true;
}
Thí dụ, tại vị trí k = 5, kiểm tra tính chuẩn của từ v[1 5] với d = 1 k/2
Mảng v:
1
2
3




n
1
2
1
3
1


so sánh các cặp từ:
v[4] và v[5] (với d = 1), có v[4] = “3” khác v[5] = “1”
v[2 3] và v[4 5] (với d = 2), có v[2 3] = “21” khác v[4 5] = “31”
Kết luận: v[1 5] = “12131” là từ chuẩn.
Q trình tìm kiếm lời giải của bài tốn từ chuẩn theo thuật tốn quay
lui có thể mơ tả bởi cây tìm kiếm lời giải sau:

Số hóa bởi Trung tâm Học liệu
/>
11




















Hình 2.1. Cây tìm kiếm lời giải cho bài tốn từ chuẩn
2.1.3. Nhận xét
Độ phức tạp của bài tốn là hàm mũ M
N
, tuy nhiên với bài tốn tìm 1
nghiệm thì có thể giải trong thời gian tƣơng đối nhanh.
Với việc tổ chức dữ liệu sử dụng kiểu dữ liệu mảng có:
Ƣu điểm: Truy nhập vào phần tử của mảng đƣợc thực hiện trực tiếp
dựa vào địa chỉ tính đƣợc nên tốc độ nhanh, đồng đều đối với mọi phần tử.
Nhƣợc điểm: Kiểu dữ liệu mảng bị hạn chế về việc khai báo kích thƣớc.
3
Start
t
1



3
2
2
1
3

1
2

1
2
3
1
2
3


Số hóa bởi Trung tâm Học liệu
/>
12
2.2. Bài tốn xếp hậu [1], [2]
2.2.1. Giới thiệu bài tốn
Phát biểu bài tốn:
Qn Hậu trên bàn cờ Vua có thể “ăn” qn khác theo hàng, theo cột
chứa nó hoặc theo đƣờng chéo của hình vng nhận nó làm đỉnh.
a) Tìm một cách xếp N qn Hậu trên bàn cờ Vua kích thƣớc N N ơ
sao cho khơng qn nào “ăn” đƣợc qn nào.
b) Tìm mọi cách xếp N qn Hậu theo điều kiện trên.
Lịch sử bài tốn:
Bài tốn đƣợc đƣa ra vào năm 1848 bởi kỳ thủ Max Bezzel, và sau đó
nhiều nhà tốn học, trong đó có Gauss và Georg Cantor, có các cơng trình về
bài tốn này và tổng qt nó thành bài tốn xếp hậu.
Các lời giải đầu tiên đƣợc đƣa ra bởi Franz Nauck năm 1850. Nauck
cũng đã tổng qt bài tốn thành bài tốn n qn 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 hồn chỉnh phƣơng pháp này. Edsger

Dijkstra đã sử dụng vấn đề này năm 1972 để minh họa sức mạnh của những
gì ơng gọi là cấu trúc chƣơng trình.
Ơng cũng mơ tả chi tiết về thuật tốn quay lui - theo chiều sâu.
Định lý: Với N > 3, có ít nhất một nghiệm cho bài tốn N qn hậu.
Định lý này đƣợc chứng minh lần đầu bới Ahrens năm 1910.
Sau đó Hoffman, Loessi, và Moore năm 1969.
Gần đây có một số lời giải mới đƣợc cơng bố, thậm chí có phƣơng án
xếp đƣợc ngay 1 nghiệm của bài tốn tại trang web:


Số hóa bởi Trung tâm Học liệu
/>
13
Các biến thể của bài tốn:
 Tìm số qn hậu tối thiểu mà có thể khống chế tất cả các ơ trong bàn
cờ. Bài tốn 3-D N qn hậu:
Đặt N
2
qn hậu trên khối lập phƣơng kích thƣớc N N N sao cho
khơng có qn hậu nào “ăn” đƣợc qn nào. Trong đó, mỗi hàng song song
với trục tọa độ hoặc mỗi đƣờng chéo chỉ có thể đặt 1 qn hậu.
 Bài tốn 9 qn hậu (đƣợc mở rộng thành bài tốn N + k queens):
Cho một số ngun dƣơng N và một số ngun khơng âm k, hãy đặt k
qn tốt và N + k qn hậu trên một bàn cờ kích thƣớc N dòng, N cột để giữa
2 qn hậu trên cùng một hàng, cột, hoặc đƣờng chéo có ít nhất một qn tốt?
 Bài tốn m qn hậu, m qn mã trên bàn cờ N N.
 Với N là số ngun tố, sẽ có nghiệm với cách giải riêng cho bài tốn.
2.2.2. Tổ chức dữ liệu và chương trình
Phương án 1. Sử dụng mảng 1 chiều
Sử dụng mảng 1 chiều x[1 n] lƣu vị trí đặt các qn hậu.

Phần tử x[i] của mảng x cho biết phải đặt Hậu thứ i tại cột i và dòng x[i].
Giả sử ta có 1 cách xếp hậu chính xác (khơng con hậu nào ăn nhau) thì
tất cả N con hậu mỗi con phải nằm trên 1 hàng và 1 cột.
Cách lƣu bàn cờ nhƣ đã giới thiệu đảm bảo rằng tất cả N con hậu, mỗi
con đứng trên 1 hàng và 1 cột riêng.
Thí dụ: Mảng x:
1
2
3



n
2
4





x[2] = 4 : đặt hậu 2 ở dòng 4 cột 2.
Trƣớc hết ta đặt các qn Hậu ở mép ngồi bàn cờ. Hậu thứ i sẽ đứng ở
đầu cột thứ i. Sau đó ta dịch dần các Hậu vào trong các dòng của bàn cờ và
ghi nhận vị trí của chúng vào một mảng x.

Số hóa bởi Trung tâm Học liệu
/>
14
// Tim cach dat Hau i tren ban co nxn
//Xuat phat tu dong x[i+1]

//Tim dong moi co the dat duoc Hau i
int DatHau(int n, int i){
int v;
for (v = x[i]+1; v <= n; ++v)
if (DatDuoc(n,i,v)) return v;
return 0;
}

Điều kiện đặt đƣợc Hậu i trên dòng v của bàn cờ là nó khơng bị các Hậu
đã đặt trƣớc đó, tức là các Hậu j = 1 (i - 1) chiếu (Tính chất P).
Hậu j < i chiếu (đụng độ) Hậu i khi và chỉ khi x[j] = x[i] (cùng dòng)
hoặc i - j = abs(x[i] - x[j]) (Hậu i và Hậu j nằm trên hai đỉnh đối diện của hình
vng, do đó hai cạnh liên tiếp của hình vng này phải bằng nhau).
Thí dụ:
Mảng x:
1
2
3



n
2
4
4




x[3] = x[2] = 4: Hậu thứ 3 nằm cùng dòng với hậu 2.

Mảng x:
1
2
3



n
2
4
3




Hậu 3 và Hậu 1 nằm trên hai đỉnh đối diện của hình vng.
Hàm DatDuoc có chức năng kiểm tra xem Hậu i có đặt đƣợc trên
dòng v trên bàn cờ.
// Dat duoc Hau i tai dong v tren ban co nxn
bool DatDuoc(int n, int i, int v){
int j;

Số hóa bởi Trung tâm Học liệu
/>
15
for(j = 1; j < i; ++j)
if(x[j] == v || i-j == abs(x[j]-v)) return 0;
return 1;
}
Hàm DatDuoc = true: tìm đƣợc một vị trí (dòng) đặt Hậu i, ngƣợc

lại DatDuoc = false.
Nếu Hậu i bị chiếu, ta dịch Hậu thứ i xuống dòng tiếp theo.
Mỗi khi đặt đƣợc Hậu thứ i ta chuyển qua Hậu tiếp theo i + 1, ngƣợc
lại, lùi Hậu i ra ngồi bàn cờ, chuyển qua xét Hậu trƣớc đó, Hậu i - 1.
Tính chất Q khi đó sẽ là: đặt đƣợc đủ N Hậu.
Xét thí dụ: Với bàn cờ kích thƣớc 4 4 (N = 4) ta có 2 lời giải:
x1 = (2, 4, 1, 3)
Mảng x:
1
2
3
4
2
4
1
3
Ý nghĩa:
Đặt Hậu thứ nhất tại (cột 1) dòng 2, Hậu thứ 2 tại (cột 2) dòng 4, Hậu
thứ 3 tại (cột 3) dòng 1 và Hậu thứ 4 tại (cột 4) dòng 3.


















Hình 2.2 Lời giải 1 với N = 4

Số hóa bởi Trung tâm Học liệu
/>
16
x2 = (3, 1, 4, 2)
Mảng x:
1
2
3
4
3
1
4
2
Ý nghĩa:
Đặt Hậu thứ nhất tại (cột 1) dòng 3, Hậu thứ 2 tại (cột 2) dòng 1, Hậu
thứ 3 tại (cột 4) dòng 1 và Hậu thứ 4 tại (cột 4) dòng 2.


















Hình 2.3 Lời giải 2 với N = 4
Ở trạng thái xuất phát, trên dòng 1 có 4 lựa chọn cho qn hậu: qn
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ẽ khơng còn ơ nào khơng bị
khống chế. Ơ (3,1) và (3,3) khống chế bởi (1,1), ơ (3,2) và (3,4) khống chế bởi
(2,4). 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 qn hậu ở dòng
thứ ba. Dòng thứ tƣ lại khơng thể đặt qn 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).

Số hóa bởi Trung tâm Học liệu
/>
17
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 tốn 4 hậu chỉ có 2 lời giải thể hiện trên cây bằng các đƣờng đi đƣợc
in đậm.


Hình 2.4 Cây lời giải bài tốn xếp hậu với N = 4
Phương án 2. Sử dụng kiểu dữ liệu bitset đánh dấu các đƣờng chéo
Ta sử dụng thêm 2 mảng kiểu bitset để đánh dấu các đƣờng chéo của
các hậu đã đặt trên bàn cờ với ý nghĩa sau đây:
Mảng cheo1 kiểm sốt các đƣờng chéo theo hƣớng Tây Bắc -
Đơng Nam.
Ta tạm gọi là các đƣờng chéo chính. Có tất cả 2N - 1 đƣờng chéo chính
trong bàn cờ vng cạnh N.
Nếu hậu k đặt trên dòng d và cột c thì sẽ kiểm sốt đƣờng chéo chính
id1(d,c) = n + (d) - (c)
Thí dụ:
Với bàn cờ kích thƣớc 4 4 ta có các 7 đƣờng chéo chính:
2,3
Start
1,1
1,2
1,3
1,4
2,4
3,2
2,4
3,1
4,3
2,1
3,4
4,2
2,1
3,3
2,2

×