Tài liu hướng dn thc hành
1
BÀI TOÁN MÃ ĐI TUN
Văn Chí Nam – Nguyn Đức Hoàng H
Lu Boun Vinh – Nguyn Anh Tun
Khoa Công ngh Thông tin, trường Đại hc Khoa hc T nhiên Tp.HCM
Phiên bn cp nht ngày 18/05/2004
1. Mô t
Cho trước mt bàn c vua có n x n ô (xét n = 8) và mt v trí đặt con Mã
trên bàn c đó. Tìmch cho con Mã nhy qua tt c các ô ca bàn c (n x n ô),
mi ô ch nhy qua duy nht mt ln và phi nhy đúng theo lut ca c Vua.
2. Nước đi ca Mã
Theo lut c Vua, ti mt v trí bt k con mã có th đi tiếp ti đa 8 v trí,
như hình v dưới đây :
1 2
8 3
X
7 4
6 5
3. Heuristic để gii bài toán
Đây là mt bài toán không có thut toán (algorithm) nhưng có th tìm được
li gii thông qua phương pháp vét cn. Dưới đây mô t hai heuristic được dùng
để tìm cách đi ca Mã
Tài liu hướng dn thc hành
2
Cách 1 (Heuristic 1) :
Heuristic 1 được mô t như dưới đây có th nói đạt hiu qu tt trong vic
tìm đường đi cho con Mã. Trong quá trình cài đặt và chy th, Heuristic này đảm
bo tìm thy đường đi cho hu hết các v trí đặt Mã ban đầu trên bàn c 8x8.
Gi s sau bước nhy th k, Mã có n v trí V1 ,V2 , ..., Vn có th đi ti bước
k+1, làm sao để chn mt trong các v trí trên để đặt Mã. Heuritic 1 miêu t như
sau:
+ Tính f(Vi) = s v trí con Mã có th nhy ti t v trí Vi.
+ So sánh cácgiá tr f(Vi) ly giá tr nh nht. Tc là chn M = Vk
min là Vk nh nht làm v trí nhy tiếp theo.
Cách 2 (Heuristic 2) :
So vi Heuristic 1, heuristic này có v đơn gin hơn nhưng thc tế hiu qu
không cao.
V trí (i,j) được chn khi h(i,j) = min(8 – i, i –1) + min(j – 1, 8 –j) là nh
nht.
4. Cu trúc d liu đề ngh
int DeltaX[DONG] = {-2,-1,1,2,-2,-1,1,2};
int DeltaY[COT] = {1,2,2,1,-1,-2,-2,-1};
typedef struct
{
int X;
int Y;
}TOADO;
int BanCo[DONG][COT];
Din gii :
DeltaX, DeltaY : mng hng s dùng để phát sinh v trí đi nước đi
ca Mã ti mt v trí bt k.
Tài liu hướng dn thc hành
3
TOADO : cu trúc mô t v trí ca Mã.
BanCo : mng hai chiu ghi nhn các nước đi ca Mã.
BanCo[i][j] = 0. Mã chưa nhy đến ô có to độ (i,j).
BanCo[i][j] = m (m
0). Mã đã nhy đến ô có to độ (i,j)
bước th m.
5. Cách chn v trí đi tiếp
Bước 1 : Phát sinh các v trí có th đi được t v trí hin hành.
Bước 2 : Tính heuristic (heuristic 1, heuristic 2) cho tng v trí.
Bước 3 : Chn v trí có heuristic là nh nht để đi bước kế tiếp
Bước 4 : Cp nht li bàn c
Bước 5 : Quay li bước 1.
6. Các hàm thc hin
Hàm Phát sinh nước đi ca Mã
void PhatSinhNDMa(int BanCo[][COT], TOADO P, TOADO
DiTiep[], int &n)
BanCo : mng 2 chiu mô t trng thái hin hành ca bàn c.
P : đim hin ti ca Mã cn được phát sinh các nước đi kế tiếp.
DiTiep : các v trí đi tiếp ca Mã nước đi kế tiếp.
n : s v trí phát sinh được.
void PhatSinhNDMa(int BanCo[][COT], TOADO P, TOADO
DiTiep[], int &n)
{
n = 0;
for (i = 0; i < DONG; i++)
{
Tài liu hướng dn thc hành
4
X = P.X + DeltaX[i]; Y = P.Y + DeltaY[i];
if (X >=0 && ....&& BanCo[X][Y] == 0)
{
.. .
n++;
}
}
}
Hàm thc hin
void main()
{
//Đọc v trí bt đầu
//Khi to ma trn BanCo
Buoc = 0;
while (Chưa kết thúc)
{
PhatSinhNDMa(BanCo,P,DiTiep,n);
if (n == 0&& Buoc<DONG*COT)
{
//Kết thúc không thành công
//Thoát
}
for (i = 0; i < n;i++)
{
h = Heuristic(BanCo, DiTiep[i]);
if (h < gtmin)
{
//Ghi nhn li v trí Tmp
Tài liu hướng dn thc hành
5
}
}
//Cp nht li mng BanCo
//P = Tmp, thc hin tiếp
Buoc++;
//kết thúc khi Buoc >= DONG*COT
}
//Xut mng BanCo
}