You are on page 1of 10

THUT TON QUAY LUI

Thut ton quay lui dng gii bi ton lit k cc cu hnh. Mi cu hnh c xy dng
bng cch xy dng tng phn t, mi phn t c chn bng cch th tt c cc kh nng.
Gi thit cu hnh cn lit k c dng (x1, x2,..., xn). Khi thut ton quay lui thc hin qua cc
bc sau:
1) Xt tt c cc gi tr x1 c th nhn, th cho x1 nhn ln lt cc gi tr . Vi mi gi tr th
gn cho x1 ta s:
2) Xt tt c cc gi tr x2 c th nhn, li th cho x2 nhn ln lt cc gi tr . Vi mi gi tr
th gn cho x2 li xt tip cc kh nng chn x3 ... c tip tc nh vy n bc:
n) Xt tt c cc gi tr xn c th nhn, th cho xn nhn ln lt cc gi tr , thng bo cu hnh
tm c (x1, x2, ..., xn).
Trn phng din quy np, c th ni rng thut ton quay lui lit k cc cu hnh n phn t dng
(x1, x2, .., xn) bng cch th cho x1 nhn ln lt cc gi tr c th. Vi mi gi tr th gn cho x1 li
lit k tip cu hnh n - 1 phn t (x2, x3, ..., xn).
M hnh ca thut ton quay lui c th m t nh sau:
{Th tc ny th cho xi nhn ln lt cc gi tr m n c th nhn}

procedure Try(i: Integer);


begin
for (mi gi tr V c th gn cho xi) do
begin
<Th cho xi := V>;
if (xi l phn t cui cng trong cu hnh) then
<Thng bo cu hnh tm c>
else
begin
<Ghi nhn vic cho xi nhn gi tr V (Nu cn)>;
Try(i + 1); {Gi quy chn tip xi+1}
<Nu cn, b ghi nhn vic th xi := V, th gi tr khc>;
end;
end;
end;

Thut ton quay lui s bt u bng li gi Try(1)


Ta c th trnh by qu trnh tm kim li gii ca thut ton quay lui bng cy sau:

Try(1)

Try(2)

Try(3)

Try(2)

Try(3)

Try(3)

Hnh 1: Cy tm kim quay lui

Try(3)

I. LIT K CC DY NH PHN DI N

Biu din dy nh phn di N di dng (x1, x2, ..., xn). Ta s lit k cc dy ny bng cch th
dng cc gi tr {0, 1} gn cho xi. Vi mi gi tr th gn cho xi li th cc gi tr c th gn cho
xi+1.Chng trnh lit k bng thut ton quay lui c th vit:
* Thut ton quay lui lit k cc dy nh phn di n program
BinaryStrings;
const
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
procedure PrintResult;
{In cu hnh tm c, do th tc tm quy Try gi khi tm ra mt cu hnh}
var
i: Integer;
begin
for i := 1 to n do Write(x[i]);
WriteLn;
end;
procedure Try(i: Integer);
var
j: Integer;
begin
for j := 0 to 1 do
begin
x[i] := j;
if i = n then PrintResult
else Try(i + 1);
end;
end;

{Th cc cch chn xi}

{Xt cc gi tr c th gn cho xi, vi mi gi tr }


{Th t xi}
{Nu i = n th in kt qu}
{Nu i cha phi l phn t cui th tm tip xi+1}

begin
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n);
{Nhpd liu}
Try(1);
{Th cc cch chn gi tr x1}
Close(Input);
Close(Output);
end.

V d: Khi n = 3, cy tm kim quay lui nh sau:


Try(1)
x1 := 0

x1 := 1

Try(2)
x2 := 0

Try(3)
x3 := 0

000

x3 := 1

001

Try(2)

x2 := 1

x2 := 0

Try(3)
x3 := 0

010

Try(3)

x3 := 1

011

x3 := 0

100

x2 := 1

Try(3)

x3 := 1

101

x3 := 0

x3 := 1

110

Hnh 2: Cy tm kim quay lui trong bi ton lit k dy nh phn

111

result

II. LIT K CC TP CON K PHN T

lit k cc tp con k phn t ca tp S = {1, 2, ..., n} ta c th a v lit k cc cu hnh (x1, x2,


..., xk) y cc xi S v x1 < x2 < ... < xk. Ta c nhn xt:
xk n
xk-1 xk - 1 n - 1
...
xi n - k + i
...
x1 n - k + 1.
T suy ra xi-1 + 1 xi n - k + i (1 i k) y ta gi thit c thm mt s x0 = 0 khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x1 t 1 (=x0 + 1) n n - k + 1, vi mi gi tr , xt tip tt
c cc cch chn x2 t x1 + 1 n n - k + 2,... c nh vy khi chn c n xk th ta c mt cu
hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
* Thut ton quay lui lit k cc tp con k phn t
program Combinations;
const
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
procedure PrintResult; (*In ra tp con {x1, x2, ..., xk}*)
var
i: Integer;
begin
Write('{');
for i := 1 to k - 1 do Write(x[i], ', ');
WriteLn(x[k], '}');
end;
procedure Try(i: Integer); {Th cc cch chn gi tr cho x[i]}
var
j: Integer;
begin
for j := x[i - 1] + 1 to n - k + i do
begin
x[i] := j;
if i = k then PrintResult
else Try(i + 1);
end;
end;
begin
Assign(Input, 'SUBSET.INP'); Reset(Input);
Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
ReadLn(n, k);
x[0] := 0;
Try(1);
Close(Input); Close(Output);
end.

Nu chng trnh trn v chng trnh lit k dy nh phn di n, ta thy v c bn chng


ch khc nhau th tc Try(i) - chn th cc gi tr cho xi, chng trnh lit k dy nh phn ta
th chn cc gi tr 0 hoc 1 cn chng trnh lit k cc tp con k phn t ta th chn xi l mt
trong cc gi tr nguyn t xi-1 + 1 n n - k + i. Qua ta c th thy tnh ph dng ca thut ton
quay lui: m hnh ci t c th thch hp cho nhiu bi ton, khc vi phng php sinh tun t,
vi mi bi ton li phi c mt thut ton sinh k tip ring lm cho vic ci t mi bi mt khc,
bn cnh , khng phi thut ton sinh k tip no cng d ci t.
III.LITKCCCHNHHPKHNGLPCHPK

lit k cc chnh hp khng lp chp k ca tp S = {1, 2, ..., n} ta c th a v lit k cc cu


hnh (x1, x2, ..., xk) y cc xi S v khc nhau i mt.
Nh vy th tc Try(i) - xt tt c cc kh nng chn xi - s th ht cc gi tr t 1 n n, m cc gi
tr ny cha b cc phn t ng trc chn. Mun xem cc gi tr no cha c chn ta s dng
k thut dng mng nh du:
Khi to mt mng c1, c2, ..., cn mang kiu logic. y ci cho bit gi tr i c cn t do hay
b chn ri. Ban u khi to tt c cc phn t mng c l TRUE c ngha l cc phn t t 1
n n u t do.
Ti bc chn cc gi tr c th ca xi ta ch xt nhng gi tr j c cj = TRUE c ngha l ch
chn nhng gi tr t do.
Trc khi gi quy tm xi+1: ta t gi tr j va gn cho xi l b chn c ngha l t cj :=
FALSE cc th tc Try(i + 1), Try(i + 2)... gi sau ny khng chn phi gi tr j na
Sau khi gi quy tm xi+1: c ngha l sp ti ta s th gn mt gi tr khc cho xi th ta s t
gi tr j va th thnh t do (cj := TRUE), bi khi xi nhn mt gi tr khc ri th cc phn
t ng sau: xi+1, xi+2 ... hon ton c th nhn li gi tr j . iu ny hon ton hp l trong
php xy dng chnh hp khng lp: x1 c n cch chn, x2 c n - 1 cch chn, ...Lu rng khi
th tc Try(i) c i = k th ta khng cn phi nh du g c v tip theo ch c in kt qu ch
khng cn phi chn thm phn t no na.
Input: file vn bn ARRANGES.INP cha hai s nguyn dng n, k (1 k n 20) cch nhau t
nht mt du cch
Output: file vn bn ARRANGES.OUT ghi cc chnh hp khng lp chp k ca tp {1, 2, ..., n}
ARRANGES.INP
3 2

ARRANGES.OUT
1 2
1 3
2 1
2 3
3 1
3 2

* Thut ton quay lui lit k cc chnh hp khng lp chp k


program Arranges;
const
max = 20;
var
x: array[1..max] of Integer;
c: array[1..max] of Boolean;
n, k: Integer;
procedure PrintResult;

{Th tc in cu hnh tm c}

var
i: Integer;
begin
for i := 1 to k do Write(x[i],' ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 1 to n do
if c[j] then
{Ch xt nhng gi tr j cn t do}
begin
x[i] := j;
if i = k then PrintResult {Nu chn c n xk th ch vic in kt qu}
else
begin
c[j] := False; {nh du: j b chn}
Try(i + 1); {Th tc ny ch xt nhng gi tr cn t do gn cho xi+1, tc l s khng chn phi j}
c[j] := True; {B nh du: j li l t do, bi sp ti s th mt cch chn khc ca xi}
end;
end;
end;
begin
Assign(Input, 'ARRANGES.INP'); Reset(Input);
Assign(Output, 'ARRANGES.OUT'); Rewrite(Output);
ReadLn(n, k);
FillChar(c, SizeOf(c), True); {Tt c cc s u cha b chn}
Try(1);
{Th cc cch chn gi tr ca x1}
Close(Input); Close(Output);
end.

Nhn xt: khi k = n th y l chng trnh lit k hon v


IV.BITONPHNTCHS

Bi ton
Cho mt s nguyn dng n 30, hy tm tt c cc cch phn tch s n thnh tng ca cc s
nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l 1 cch.
Cch lm:
1. Ta s lu nghim trong mng x, ngoi ra c mt mng t. Mng t xy dng nh sau: ti s l tng
cc phn t trong mng x t x1 n xi: ti := x1 + x2 + ... + xi.
2. Khi lit k cc dy x c tng cc phn t ng bng n, trnh s trng lp ta a thm rng
buc xi-1 xi.
3. V s phn t thc s ca mng x l khng c nh nn th tc PrintResult dng in ra 1 cch
phn tch phi c thm tham s cho bit s in ra bao nhiu phn t.
4. Th tc quy Try(i) s th cc gi tr c th nhn ca xi (xi xi - 1)
5. Khi no th in kt qu v khi no th gi quy tm tip ?
Lu rng ti - 1 l tng ca tt c cc phn t t x1 n xi-1 do
Khi ti = n tc l (xi = n - ti - 1) th in kt qu
Khi tm tip, xi+1 s phi ln hn hoc bng xi. Mt khc ti+1 l tng ca cc s t x1 ti xi+1
khng c vt qu n. Vy ta c ti+1 n ti-1 + xi + xi+1 n xi + xi + 1 n - ti - 1 tc l xi

(n - ti - 1)/2. V d n gin khi n = 10 th chn x1 = 6, 7, 8, 9 l vic lm v ngha v nh


vy cng khng ra nghim m cng khng chn tip x2 c na.
Mt cch d hiu ta gi quy tm tip khi gi tr xi c chn cn cho php chn thm mt
phn t khc ln hn hoc bng n m khng lm tng vt qu n. Cn ta in kt qu ch khi
xi mang gi tr ng bng s thiu ht ca tng i-1 phn t u so vi n.
6. Vy th tc Try(i) th cc gi tr cho xi c th m t nh sau: ( tng qut cho i = 1, ta t x0 =
1 v t0 = 0).
Xt cc gi tr ca xi t xi - 1 n (n - ti-1) div 2, cp nht ti := ti - 1 + xi v gi quy tm tip.
Cui cng xt gi tr xi = n - ti-1 v in kt qu t x1 n xi.
Input: file vn bn ANALYSE.INP cha s nguyn dng n 30
Output: file vn bn ANALYSE.OUT ghi cc cch phn tch s n.
ANALYSE.INP
6

ANALYSE.OUT
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6 = 6

* Thut ton quay lui lit k cc cch phn tch s


program Analyses;
const
max = 30;
var
n: Integer;
x: array[0..max] of Integer;
t: array[0..max] of Integer;
procedure Init;
begin
ReadLn(n);
x[0] := 1;
t[0] := 0;
end;

{Khi to}

procedure PrintResult(k: Integer);


var
i: Integer;
begin
Write(n,' = ');
for i := 1 to k - 1 do Write(x[i], '+');
WriteLn(x[k]);
end;
procedure Try(i: Integer);
var
j: Integer;
begin
for j := x[i - 1] to (n - T[i - 1]) div 2 do
begin
x[i] := j;

{Trng hp cn chn tip xi+1}

t[i] := t[i - 1] + j;
Try(i + 1);
end;
x[i] := n - T[i - 1];
{Nu xi l phn t cui th n bt buc phi l ... v in kt qu}
PrintResult(i);
end;
begin
Assign(Input, 'ANALYSE.INP'); Reset(Input);
Assign(Output, 'ANALYSE.OUT'); Rewrite(Output);
Init;
Try(1);
Close(Input);
Close(Output);
end.

By gi ta xt tip mt v d kinh in ca thut ton quay lui:


V.BITONXPHU

Bi ton
Xt bn c tng qut kch thc nxn. Mt qun hu trn bn c c th n c cc qun khc nm
ti cc cng hng, cng ct hoc cng ng cho. Hy tm cc xp n qun hu trn bn c sao
cho khng qun no n qun no.
V d mt cch xp vi n = 8:

Hnh 3: Xp 8 qun hu trn bn c 8x8

Phn tch
R rng n qun hu s c t mi con mt hng v hu n c ngang, ta gi qun hu s t
hng 1 l qun hu 1, qun hu hng 2 l qun hu 2... qun hu hng n l qun hu n.
Vy mt nghim ca bi ton s c bit khi ta tm ra c v tr ct ca nhng qun hu.
Nu ta nh hng ng (Phi), Ty (Tri), Nam (Di), Bc (Trn) th ta nhn thy rng:
Mt ng cho theo hng ng Bc - Ty Nam (B-TN) bt k s i qua mt s , cc
c tnh cht: Hng + Ct = C (Const). Vi mi ng cho B-TN ta c 1 hng s C v
vi mt hng s C: 2 C 2n xc nh duy nht 1 ng cho B-TN v vy ta c th nh
ch s cho cc ng cho B- TN t 2 n 2n
Mt ng cho theo hng ng Nam - Ty Bc (N-TB) bt k s i qua mt s , cc
c tnh cht: Hng - Ct = C (Const). Vi mi ng cho N-TB ta c 1 hng s C v
vi mt hng s C: 1 - n C n - 1 xc nh duy nht 1 ng cho N-TB v vy ta c th
nh ch s cho cc ng cho N- TB t 1 - n n n - 1.

1
2

3
W

4
5

6
7
8

Hnh 4: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0, chung (5, 5)

Ci t:
1. Ta c 3 mng logic nh du:
Mng a[1..n]. ai = TRUE nu nh ct i cn t do, ai = FALSE nu nh ct i b mt qun hu
khng ch
Mng b[2..2n]. bi = TRUE nu nh ng cho B-TN th i cn t do, bi = FALSE nu nh
ng cho b mt qun hu khng ch.
Mng c[1 - n..n - 1]. ci = TRUE nu nh ng cho N-TB th i cn t do, ci = FALSE nu
nh ng cho b mt qun hu khng ch.
Ban u c 3 mng nh du u mang gi tr TRUE. (Cc ct v ng cho u t do)
2. Thut ton quay lui: Xt tt c cc ct, th t qun hu 1 vo mt ct, vi mi cch t nh vy,
xt tt c cc cch t qun hu 2 khng b qun hu 1 n, li th 1 cch t v xt tip cc cch t
qun hu 3...Mi cch t c n qun hu n cho ta 1 nghim
3. Khi chn v tr ct j cho qun hu th i, th ta phi chn (i, j) khng b cc qun hu t trc
n, tc l phi chn ct j cn t do, ng cho B-TN (i+j) cn t do, ng cho N-TB(i-j)
cn t do. iu ny c th kim tra (aj = bi+j = ci-j = TRUE)
4. Khi th t c qun hu th i vo ct j, nu l qun hu cui cng (i = n) th ta c mt
nghim. Nu khng:
Trc khi gi quy tm cch t qun hu th i + 1, ta nh du ct v 2 ng cho b qun
hu va t khng ch (aj = bi+j = ci-j := FALSE) cc ln gi quy tip sau chn cch t
cc qun hu k tip s khng chn vo nhng nm trn ct j v nhng ng cho ny na.
Sau khi gi quy tm cch t qun hu th i + 1, c ngha l sp ti ta li th mt cch t
khc cho qun hu th i, ta b nh du ct v 2 ng cho b qun hu va th t khng ch
(aj = bi+j = ci-j := TRUE) tc l ct v 2 ng cho li thnh t do, bi khi t qun hu i
sang v tr khc ri th ct v 2 ng cho hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh du.
y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi tr c t do
khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng cho B-TN,
ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n qun xe ln bn c
nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 12
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu

QUEENS.INP
5

QUEENS.OUT
(1, 1); (2,
(1, 1); (2,
(1, 2); (2,
(1, 2); (2,
(1, 3); (2,
(1, 3); (2,
(1, 4); (2,
(1, 4); (2,
(1, 5); (2,
(1, 5); (2,

3);
4);
4);
5);
1);
5);
1);
2);
2);
3);

(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,

5);
2);
1);
3);
4);
2);
3);
5);
4);
1);

(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,

2);
5);
3);
1);
2);
4);
5);
3);
1);
4);

(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,

4);
3);
5);
4);
5);
1);
2);
1);
3);
2);

* Thut ton quay lui gii bi ton xp hu


program n_Queens;
const
max = 12;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
procedure Init;
begin
ReadLn(n);
FillChar(a, SizeOf(a), True); {Mi ct u t do}
FillChar(b, SizeOf(b), True); {Mi ng cho ng Bc - Ty Nam u t do}
FillChar(c, SizeOf(c), True);, {Mi ng cho ng Nam - Ty Bc u t do}
end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write('(', i, ', ', x[i], '); ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch t qun hu th i vo hng i}
var
j: Integer;
begin
for j := 1 to n do
if a[j] and b[i + j] and c[i - j] then {Ch xt nhng ct j m (i, j) cha b khng ch}
begin
{Th t qun hu i vo ct j}
x[i] := j;
if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False; {nh du}
Try(i + 1);
{Tmcc cch t qun hu th i + 1}
a[j] := True; b[i + j] := True; c[i - j] := True;
{B nh du}
end;
end;
end;
begin
Assign(Input, 'QUEENS.INP'); Reset(Input);
Assign(Output, 'QUEENS.OUT'); Rewrite(Output);
Init;

Try(1);
Close(Input); Close(Output);
End.

Tn gi thut ton quay lui, ng trn phng din ci t c th nn gi l k thut


vt cn bng quay lui th chnh xc hn, tuy nhin ng trn phng din bi ton,
nu nh ta coi cng vic gii bi ton bng cch xt tt c cc kh nng cng l 1
cch gii th tn gi Thut ton quay lui cng khng c g tri logic. Xt hot ng
ca chng trnh trn cy tm kim quay lui ta thy ti bc th chn xi n s gi
quy tm tip xi+1 c ngha l qu trnh s duyt tin su xung pha di n tn
nt l, sau khi duyt ht cc nhnh, tin trnh li li th p t mt gi tr khc cho
xi, chnh l ngun gc ca tn gi "thut ton quay lui"
Bi tp:
1. Mt s chng trnh trn x l khng tt trong trng hp tm thng (n = 0
hoc k = 0), hy khc phc cc li
2. Vit chng trnh lit k cc chnh hp lp chp k
ca n phn t
3. Cho hai s nguyn dng l, n. Hy lit k cc xu nh phn di n c tnh cht,
bt k hai xu con no di l lin nhau u khc nhau.
4. Vi n = 5, k = 3, v cy tm kim quay lui ca chng trnh lit k t hp chp k
ca tp {1, 2, ..., n}
5. Lit k tt c cc tp con ca tp S gm n s nguyn {S1, S2, ..., Sn} nhp
vo t bn phm
6. Tng t nh bi 5 nhng ch lit k cc tp con c max - min T
(T cho trc).
7. Mt dy (x1, x2, ..., xn) gi l mt hon v hon ton ca tp {1, 2,..., n} nu n l
mt hon v v tho mn xi i vi i: 1 i n. Hy vit chng trnh lit k tt c
cc hon v hon ton ca tp trn (n vo t bn phm).
8. Sa li th tc in kt qu (PrintResult) trong bi xp hu c th v hnh bn c
v cc cch t hu ra mn hnh.
9. Bi ton m i tun: Cho bn c tng qut kch thc nxn v mt qun M, hy
ch ra mt hnh trnh ca qun M xut pht t ang ng i qua tt c cc cn li
ca bn c, mi ng 1 ln.
10. Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t
sang quay lui.
11. Xt s giao thng gm n nt giao thng nh s t 1 ti n v m on ng
ni chng, mi on ng ni 2 nt giao thng. Hy nhp d liu v mng li
giao thng , nhp s hiu hai nt giao thng s v d. Hy in ra tt c cc cch i t s
ti d m mi cch i khng c qua nt giao thng no qu mt ln.

You might also like