You are on page 1of 20

CHUYÊN ĐỀ: ĐỆ QUI QUAY LUI

I. Lý thuyết
1. Bµi to¸n tæng qu¸t
Cho tËp d÷ liÖu D. Yªu cÇu t×m mét bé v = (v[1], v[2],..., v[j]) trªn tËp
D tho¶ m·n ®ång thêi hai tÝnh chÊt P vµ Q.
VÝ dô:
 Bµi to¸n 1: LiÖt kª c¸c ho¸n vÞ cña c¸c sè tù nhiªn 1..N
- TËp d÷ liÖu D={1, 2, 3, ..., N} lµ c¸c sè cã thÓ chän cho mçi vÞ trÝ
- Bé v = (v[1], v[2],..., v[j]) lµ mét ho¸n vÞ
- TÝnh chÊt P: v[i] ≠ v[j] víi i ≠ j vµ v[i] D víi i =1, 2, …, j
- TÝnh chÊt Q: j =N
 Bµi to¸n 2: LiÖt kª c¸c c¸ch xÕp N qu©n hËu lªn bµn cê NxN sao cho
kh«ng cã hai qu©n hËu nµo ¨n nhau.
- TËp d÷ liÖu D={1, 2, …, N} lµ c¸c dßng cã thÓ ®Æt mét qu©n hËu
- Bé v = (v[1], v[2],..., v[j]) lµ vÞ trÝ dßng ®Æt cña c¸c qu©n hËu,
nÕu v[j] = i cã nghÜa lµ qu©n hËu thø j ®îc ®Æt t¹i « (i,j)
- TÝnh chÊt P: víi i ≠ j th×
+ v[i] ≠ v[j]
+ hai « (v[i], i) vµ (v[j],j) kh«ng cïng n»m trªn mét ®êng chÐo
- TÝnh chÊt Q: j = N

2. Ph¬ng ph¸p quay lui


Gi¶ sö v = (v[1], v[2],..., v[j]) lµ mét cÊu h×nh cÇn t×m, hiÖn t¹i ta ®·
t×m ®îc k-1 thµnh phÇn cña bé v lµ v[1], v[2],..., v[k-1], ta t×m thµnh phÇn
thø k b»ng c¸ch duyÖt hÕt tÊt c¶ c¸c kh¶ n¨ng iD cã thÓ cña v[k], víi mçi
kh¶ n¨ng i kiÓm tra xem cã thÓ chÊp nhËn ®îc kh«ng (tháa m·n P). Cã hai
kh¶ n¨ng x¶y ra:
- NÕu nhËn ®îc th× x¸c ®Þnh v[k] theo i vµ kiÓm tra xem bé v cã
tháa m·n tÝnh chÊt Q (k = N) cha, nÕu k = n th× ta ghi nhËn mét
cÊu h×nh, cßn nÕu k < N ta gäi tiÕn hµnh x¸c ®Þnh v[j+1].
- NÕu thö tÊt c¶ c¸c kh¶ n¨ng mµ kh«ng cã kh¶ n¨ng nµo chÊp nhËn
®îc th× quay l¹i bíc tríc x¸c ®Þnh l¹i v[k-1] (quay lui)
Thñ tôc ®Ö quy quay lui tæng qu¸t:
Procedure Try(k:integer); {T×m thµnh phÇn thø k (v[k])}
Var i : integer;
Begin
For [mçi ph¬ng ¸n chän i ] Do
If [chÊp nhËn ®îc i] Then
Begin
[Thùc hiÖn chän ph¬ng ¸n i cho v[k]];
If [Thµnh c«ng] Then [Th«ng b¸o kÕt qu¶]
Else Try(k+1); {T×m thµnh phÇn thø k+1}
[Hñy bá chän i cho v[k]];
End;
End;

3. VÝ dô minh häa
 Bµi to¸n 1: LiÖt kª c¸c ho¸n vÞ cña c¸c sè tù nhiªn 1..N
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): t×m thµnh phÇn thø k cña ho¸n vÞ
- Ph¬ng ¸n chän: i =1,..,N
- ChÊp nhËn ®îc i: khi i cha ®îc chän ë c¸c thµnh phÇn 1,.., k-1
- Thùc hiÖn bíc chän: ®¸nh dÊu i ®· chän cho thµnh phÇn k
- Thµnh c«ng: khi chän ®îc thµnh phÇn thø k = N
- Th«ng b¸o kÕt qu¶ : hiÓn thÞ N sè cña ho¸n vÞ
- Hñy chän : ®¸nh dÊu i cha ®îc chän
Tæ chøc d÷ liÖu
- M¶ng V[1..N] : lu mét ho¸n vÞ, v[k] :=i cã nghÜa lµ sè thø k cña
ho¸n vÞ lµ sè i
- M¶ng ®¸nh dÊu B[1..N] kiÓu logic; B[i] := True nghÜa lµ sè i cha
®îc chän, B[i] := Flase nghÜa lµ sè i ®· ®îc chän.
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc t×m c¸c ho¸n vÞ
Procedure Try(k:integer); {T×m thµnh phÇn thø k cña ho¸n vÞ}
Var i : integer;
Begin
For i:=1 To N Do {XÐt mçi ph¬ng ¸n chän i}
If B[i] Then {sè i cha ®îc chän vµo thµnh phÇn nµo}
Begin
V[k] := i; B[i] := False; {®¸nh dÊu i ®îc chän}
If k=N Then TBKQ {In kÕt qu¶ cña ho¸n vÞ tõ m¶ng V}
Else Try(k+1);
B[i] := True; {®¸nh dÊu hñy chän ®Ønh i}
End;
End;
- Thñ tôc hiÓn thÞ c¸c ho¸n vÞ lªn mµn h×nh
Procedure TBKQ; {In c¸c sè trong m¶ng V lªn mµn h×nh}
Var i : integer;
Begin
For i:=1 to N do write(V[i], ‘ ‘);
Writeln;
End;
- Ch¬ng tr×nh chÝnh
Readln(N);
For i:=1 To N Do B[i] := True; {Khëi t¹o tÊt c¶ c¸c sè cha ®îc chän}
Try(1); {T×m c¸c thµnh phÇn cña ho¸n vÞ b¾t ®Çu tõ v[1]}

 Bµi to¸n 2: LiÖt kª c¸c c¸ch xÕp N qu©n hËu lªn bµn cê NxN sao cho
kh«ng cã hai qu©n hËu nµo ¨n nhau.
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): t×m vÞ trÝ dßng ®Æt qu©n hËu ë cét thø k
- Ph¬ng ¸n chän: i =1,..,N
- ChÊp nhËn ®îc i: khi i cha ®îc chän vµ « (i,j) kh«ng cïng n¨m trªn
mét ®êng chÐo víi bÊt k× « nµo ®· chän tríc ®ã
- Thùc hiÖn bíc chän: ®¸nh dÊu dßng i ®· chän ®Æt cho qu©n hËu
ë cét thø k vµ c¸c ®êng chÐo ®i qua « (i,k) ®· ®îc ®Æt qu©n hËu
- Thµnh c«ng: khi chän ®îc thµnh phÇn thø k = N
- Th«ng b¸o kÕt qu¶ : hiÓn thÞ chØ sè dßng ®Æt c¸c qu©n hËu theo
thø tù tõ cét 1 ®Õn cét N
- Hñy chän : ®¸nh dÊu i cha ®îc chän
Tæ chøc d÷ liÖu
- M¶ng V[1..N]: lu mét c¸ch ®Æt, v[k] :=i cã nghÜa lµ qu©n hËu ë
cét thø k ®îc ®Æt t¹i dßng i (qu©n hËu nµy ®Æt t¹i « (i,k))
- M¶ng ®¸nh dÊu dßng D[1..N] kiÓu logic. D[i] = True nghÜa lµ
dßng i cha ®Æt qu©n hËu nµo, D[i] = Flase nghÜa lµ dßng i ®· ®îc
®Æt råi.
- M¶ng ®¸nh dÊu c¸c ®êng chÐo chÝnh (cã i + j = const) CC[2..2N]
kiÓu logic. CC[i+j] = True cã nghÜa lµ cha cã qu©n hËu nµo n»m
trªn ®êng chÐo chÝnh ®i qua « (i,j), ngîc l¹i CC[i+j] = Flase
- M¶ng ®¸nh dÊu c¸c ®êng chÐo phô (cã i - j = const) CP[-(N-1)..N-
1] kiÓu logic. CP[i-j] = True cã nghÜa lµ ch cã qu©n hËu nµo ®îc
®Æt trªn ®êng chÐo phô ®i qua « (i,j), ngîc l¹i CP[i-j] = False
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc t×m c¸c vÞ trÝ ®Æt c¸c qu©n hËu
Procedure Try(k:integer); {T×m vÞ trÝ dßng ®Æt ®Ó qu©n hËu ë cét
thø k}
Var i : integer;
Begin
For i:=1 To N Do {XÐt mçi ph¬ng ¸n chän i}
If D[i] And CC[i+k] And CP[i-k] Then
{Dßng i vµ c¸c ®êng chÐo qua « (i,k) cha ®îc ®Æt qu©n hËu}
Begin
V[k] := i; D[i] := False; CC[i+k] := False; CP[i-k] := False;
{®¸nh dÊu dßng i vµ c¸c ®êng chÐo qua « (i,k) ®· ®îc ®Æt qu©n hËu}
If k=N Then TBKQ {In kÕt qu¶ tõ m¶ng V}
Else Try(k+1);
B[i] := True; CC[i+k] := True; CP[i-k] := True;
{®¸nh dÊu hñy chän ®Ønh i vµ c¸c ®êng chÐo qua « (i,k)}
End;
End;
- Thñ tôc hiÓn thÞ c¸c ho¸n vÞ lªn mµn h×nh
Procedure TBKQ; {In c¸c sè trong m¶ng V lªn mµn h×nh}
Var i : integer;
Begin
For i:=1 to N do write(V[i], ‘ ’);
Writeln;
End;
- Ch¬ng tr×nh chÝnh
Readln(N);
For i:=1 to N do D[i] := True; {Khëi t¹o gi¸ trÞ cña dßng, c¸c ®êng chÐo}
For i:=-(N-1) To N-1 Do CP[i] := True;For i:=2 To 2*N Do CC[i] := True;
Try(1);

II. Bµi tËp


1. Mét sè bµi bµi tËp cã híng dÉn gi¶i

Bµi tËp 1. Vßng trßn nguyªn tè


Mét vßng trßn chøa 2n vßng trßn nhá (Xem h×nh
vÏ). C¸c vßng trßn nhá ®îc ®¸nh sè tõ 1 ®Õn 2n theo
chiÒu kim ®ång hå. LiÖt kª c¸c c¸ch ®iÒn c¸c sè tù
nhiªn tõ 1 ®Õn 2n mçi sè vµo mét vßng trßn nhá sao
cho tæng cña hai sè trªn hai vßng trßn nhá liªn tiÕp lµ sè nguyªn tè. Sè ®iÒn
ë vßng trßn nhá ®îc ®¸nh sè 1 lu«n lµ sè 1.
VÝ du;
N  KÕt qu¶: 1 4 3 2
=3 56

NhËn xÐt: c¸c yÕu tè cña bµi to¸n cho phÐp sö dông thuËt to¸n quay
lui.
- TËp d÷ liÖu: D= {1, 2, …, 2N}
- Mét c¸ch ®Æt c¸c sè lµ mét bé v = (v[1], v[2],..., v[j]) víi v[i] lµ gi¸
trÞ sè ®îc ®Æt t¹i vßng trßn thø i
- TÝnh chÊt P :
+ víi i ≠ j th× v[i] ≠ v[j]
+ v[i]+v[i-1] lµ sè nguyªn tè i=2, …, 2N
- TÝnh chÊt Q: j=2N vµ v[1] + v[2N ] lµ sè nguyªn tè
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): t×m sè ®Æt vµo vßng trßn thø k
- Ph¬ng ¸n chän: c¸c sè i tõ 2 .. 2N
- ChÊp nhËn ®îc i: khi i cha chän vµ i + v[k-1] lµ 1 sè nguyªn tè
- Thùc hiÖn bíc chän: ®¸nh dÊu i ®· ®îc chän cho v[k]
- Thµnh c«ng: khi K=2N vµ v[k]+v[1] lµ sè nguyªn tè
- Th«ng b¸o kÕt qu¶: hiÓn thÞ c¸c sè ®îc ®iÒn theo thø tù tõ 1..2N
- Hñy chän: ®¸nh dÊu sè i cha ®îc chän
Tæ chøc d÷ liÖu
- M¶ng V[1..2N] lu mét c¸ch ®Æt, V[i]=j cã nghÜa lµ vßng trßn thø i
®îc ®Æt sè j
- M¶ng ®¸nh dÊu B[1..2N] kiÓu logic, B[i]=True cã nghÜa lµ sè i cha
®îc ®Æt vµo bÊt cø vßng trßn nµo, ngîc l¹i B[i]=False
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc t×m c¸ch ®Æt sè vµo c¸c vßng trßn
Procedure Try(k:integer); {T×m sè ®Æt vµo vßng trßn thø k}
Var i : integer;
Begin
For i:=2 To 2*N Do {XÐt mçi ph¬ng ¸n chän}
If B[i] and (NguyenTo(i+V[k-1])) Then {NÕu chÊp nhËn ®îc i}
Begin
V[k] := i; B[i]:=False; {§¸nh dÊu sè i ®Æt vµo vßng trßn k}
If (k=2N)and(NguyenTo(V[1]+V[k])) Then TBKQ
Else Try(k+1); {T×m sè ®Æt vµo vßng tiÕp theo}
B[i] := True; {§¸nh dÊu i cha ®îc chän}
End;
End;
- Hµm kiÓm tra sè nguyªn tè
Function NguyenTo(n:integer):Boolean;
Var i: integer;
Begin
For i:=2 To n Div 2 Do
If n mod i=0 Then Begin NguyenTo:=False; Exit; End;
If n<2 Then NguyenTo:=False Else NguyenTo := True;
End;
- Thñ tôc th«ng b¸o kÕt qu¶
Procedure TBKQ;
Var i : integer;
Begin
For i:=1 To 2*N Do Write(V[i],' '); Writeln;
End;
- Ch¬ng tr×nh chÝnh
Readln(N);
For i:=2 To 2*N Do B[i] := True;
V[1] := 1;
Try(1);

Bµi tËp 2. D·y sè


Cho d·y N sè nguyªn a[1], a[2], …, a[N] vµ sè nguyªn M. T×m mét c¸ch
chän tõ d·y trªn nhiÒu nhÊt c¸c sè sao cho tæng b»ng M.
VÝ dô
N=5 M=10
D·y sè: 1 4 3 5  KÕt qu¶: 1 4 3 2
2
NhËn xÐt: c¸c yÕu tè cña bµi to¸n cho phÐp sö dông thuËt to¸n quay
lui.
- TËp d÷ liÖuD : chän c¸c sè cã vÞ trÝ {1, 2, …, N}
- Mét ph¬ng ¸n chän c¸c sè lµ mét bé v = (v[1], v[2],..., v[j]) víi v[i] lµ
vÞ trÝ sè ®îc chän thø i trong d·y
- TÝnh chÊt P : víi i ≠ j th× v[i] ≠ v[j]
- TÝnh chÊt Q: a[v[1]]+a[v[2]] + … + a[v[j]] = M
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): chän vÞ trÝ sè trong d·y ë lÇn chän thø k
- Ph¬ng ¸n chän: c¸c vÞ trÝ i tõ 1 ®Õn N
- ChÊp nhËn ®îc i: khi i cha chän
- Thùc hiÖn bíc chän: ®¸nh dÊu i ®· ®îc chän cho v[k], tæng c¸c sè
®· chän T := T + a[v[k]]
- Thµnh c«ng: khi T=M
- CËp nhËp c¸ch chän nhiÒu nhÊt: dùa vµo sè lîng lÇn chän k
- Hñy chän: ®¸nh dÊu sè i cha ®îc chän vµ T := T - a[v[k]]
Tæ chøc d÷ liÖu
- M¶ng V[1..N] lu mét c¸ch chän c¸c sè cña d·y, V[i]=j cã nghÜa lµ
sè ë lÇn chän thø i lµ a[j]. M¶ng C[1..N] lu c¸ch chän dµi nhÊt.
- Sè nguyªn T lu tæng c¸c sè cña mét c¸ch chän, sè nguyªn max lu sè l-
îng phÇn tö trong c¸ch chän nhiÒu nhÊt.
- M¶ng ®¸nh dÊu B[1..N] kiÓu logic, B[i]=True cã nghÜa lµ sè ë vÞ
trÝ i cha ®îc chän, ngîc l¹i B[i]=False
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc chän vÞ trÝ sè trong d·y ë lÇn chän thø k
Procedure Try(k:integer);
Var i : integer;
Begin
For i:= 1 To N Do {XÐt mçi ph¬ng ¸n chän}
If B[i] Then {Sè a[i] cha chän}
Begin
V[k] := i; B[i] := True;{§¸nh dÊu a[i] ®îc chän bíc thø k}
T := T + a[V[k]]; {CËp nhËt l¹i tæng c¸c sè ®· chän}
If T=M Then CapNhat(k) {cËp nhËt c¸ch chän nhiÒu nhÊt}
Else If T<M Then Try(k+1);
T := T - a[V[k]]; B[i] := True;
End;
End;
- Thñ tôc cËp nhËt c¸ch chän nhiÒu phÇn tö nhÊt
Procedure CapNhat(k:integer);
Var i : integer;
Begin
If k>Max Then
Begin
Max := k; {CËp nhËt sè lîng phÇn tö nhiÒu nhÊt}
For i:=1 to Max Do C[i] := V[i];
End;
End;
- Ch¬ng tr×nh chÝnh
Readln(N,M); For i:=1 To N Do Read(A[i]);
T := 0; {Khëi t¹o tæng c¸c phÇn tö ®· chän}
Max:=0; {Khëi t¹o sè lîng phÇn ®· chän tö nhiÒu nhÊt}
For i:=1 To N Do B[i] := True; {Khëi t¹o c¸c sè cha ®îc chän}
Try(1); {Chän b¾t ®Çu tõ phÇn tö ®Çu tiªn}
For i:=1 To Max Do Write(C[i],' '); {In c¸ch chän nhiÒu phÇn tö nhÊt}

Bµi tËp 3. §êng ®i trªn líi


Cho líi « vu«ng kÝch thíc MxN, trªn mçi « cña líi ®îc ghi mét sè nguyªn
d¬ng. Mét r«-bèt ®Æt t¹i « (x,y) cã thÓ di chuyÓn ®Õn 4 « kÒ c¹nh víi nã
nÕu nh íc sè chung lín nhÊt cña 2 sè trong 2 « ®ã lín h¬n 1. H·y ®Õm sè l-
îng c¸c ®êng ®i cña r«-bèt xuÊt ph¸t tõ « (1,1) ®ªn « (N,M), trªn ®êng ®i
mçi « chØ ®îc ®i qua 1 lÇn.
VÝ dô
M=5 N=4
2 4 3 6
8 6 5 3
1 2 8 6
7 3 2 2
9 8 5 6 KÕt qu¶: 4
NhËn xÐt: c¸c yÕu tè cña bµi to¸n cho phÐp sö dông thuËt to¸n quay
lui.
- TËp d÷ liÖu: D= {(x,y)/ 1≤ x M, 1 ≤ y ≤ N}
- Mét ®êng ®i lµ mét bé v = (v[1], v[2],..., v[j]) víi v[i] lµ « (xi,yi)
- TÝnh chÊt P : víi i ≠ j th× v[i] ≠ v[j]
- TÝnh chÊt Q: v[j] = (M,N)
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): chän « sÏ ®Õn ë lÇn thø k
- Ph¬ng ¸n chän: 4 « kÒ víi « ë lÇn chän k-1
- ChÊp nhËn ®îc: khi « ®ã cha chän vµ USCLN cña sè trong « ®ã víi
« ë lÇn chän k-1 ph¶i lín h¬n 1.
- Thùc hiÖn bíc chän: ®¸nh dÊu « ®· ®îc chän cho v[k]
- Thµnh c«ng: khi « ë lÇn chän thø k cã x=M vµ y=N
- Hñy chän: ®¸nh dÊu « ®· chän cho v[k] cha ®îc chän
Tæ chøc d÷ liÖu
- M¶ng sè nguyªn A[0..M+1,0..N] ®Ó lu c¸c sè trªn líi. Khëi t¹o
A[0,j] :=1, A[m+1,j] :=1, A[i,0] :=1 vµ A[i,N+1] :=1 lµm lÝnh canh.
- M¶ng sè nguyªn V[1..m*n,1..2] ®Ó lu c¸c « trªn ®êng ®i. V[i][1] lu
xi, V[i][2] lu yi.
- M¶ng ®¸nh dÊu B[0..m+1,0..n+1] liÓu logic. B[i,j]=True cã nghÜ
lµ «(i,j) cha ®i qua, ngîc l¹i B[i,j] := False.
- M¶ng h»ng dx[1..4] =(0,0,1,-1) vµ dy[1..4]=(1,-1,0,0) ®Ó x¸c ®Þnh
täa ®é 4 « kÒ víi « (x,y)
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc chän « sÏ ®Õn ë lÇn thø k
Procedure Try(k:integer); {chän « sÏ ®Õn ë lÇn thø k}
Var i, z, t: integer;
Begin
For i:=1 To 4 Do {XÐt c¸c ph¬ng ¸n chän}
Begin
z := V[k-1][1]+dx[i]; t := V[k-1][2]+dy[i];
If B[x,t] and (UCLN(A[V[k-1][1],V[k-1][2], A[z,t]>1) Then
Begin {Thùc hiÖn chän « (z,t) ë lÇn ®Õn thø k}
V[k][1] := z; V[k][2] := t; B[z,t] := False;
If (z=M)and(t=N) Then dem := dem + 1
Else Try(k+1);
B[z,t] := True; {Hñy chän}
End;
End;
End;
- Hµm tÝnh íc sè chung lín nhÊt
Function UCLN(a,b: integer):integer;
Begin
If a mod b=0 Then UCLN := b Else
UCLN := UCLN(b, a mod b);
End;
- Ch¬ng tr×nh chÝnh
- §äc ®äc d÷ liÖu
For i:=1 to M do For j:=1 to N Do B[i,j] := True;
For i:=0 To M+1 Do Begin A[i,0] := 1; A[i,N+1] :=1; End;
For j:=0 To N+1 Do Begin A[0,j] := 1; A[M+1,j]:= 1; End;
V[1][1] := 1; V[1][2] := 1; {Bíc ®i ®Çu tiªn lµ « (1,1)}
dem := 0;
Try(2);
Writlen(dem);

Bµi tËp 4. Sodoku


Mçi b¶ng sè Sudoku lµ mét b¶ng h×nh vu«ng kÝch thíc 9x9, ®îc chia
lµm 9 h×nh vu«ng nhá 3x3. Trªn mçi hµng, mçi cét, mçi h×nh 3x3 ®Òu
chøa c¸c con sè tõ 1 ®Õn 9.
Cho b¶ng Sudoku sau khi xãa bá mét vµi sè trªn b¶ng. H·y t×m mét c¸ch
®iÒn c¸c sè vµo c¸c « cßn l¹i ®Ó ®îc mét b¶ng Sudoku hoµn chØnh.
VÝ dô:
Input Output
032007900 132687945
500400800 597423816
040100027 846159327
050006700 351246789
078030200 978531264
204900000 264978531
000060000 785364192
000700000 413792658
600005003 629815473

NhËn xÐt: c¸c yÕu tè cña bµi to¸n cho phÐp sö dông thuËt to¸n quay
lui.
- TËp d÷ liÖu D : c¸c sè ®îc chän trong mçi «{1, 2, .., 9}
- Mét b¶ng Sodoku mét bé v = (v[1], v[2],..., v[j]) víi v[i] lµ sè ®îc lu
« (xi,yi). VÝ dô v[1] lµ sè lu ë «(1,1), v[2] lµ sè lu ë « (1,2), .., v[80]
lµ sè lu ë « (9,8), v[81] lµ sè lu ë «(9,9).
- TÝnh chÊt P : víi i ≠ j th× v[i] ≠ v[j] nÕu « v[i] vµ v[j] n»m ë trong
cïng mét hµng hoÆc mét cét hoÆc mét h×nh vu«ng 3x3
- TÝnh chÊt Q: j=81
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): chän sè ®iÒn vµo « thø k
- Ph¬ng ¸n chän: c¸c sè i tõ 1..9
- ChÊp nhËn ®îc i: khi i cha ®îc chän vµo c¸c « cïng hang hoÆc cïng
cét hoÆc cïng h×nh vu«ng 3x3 cha « thø k.
- Thùc hiÖn bíc chän: sè i cho v[k]
- Thµnh c«ng: khi j=81
- Hñy chän: sè ®· chän cho v[k] cha ®îc chän
Tæ chøc d÷ liÖu
- M¶ng sè nguyªn A[1..9,1..9] ®Ó lu c¸c sè trªn b¶ng.
- M¶ng logic D[1..9,1..9] ®Ó ®¸nh dÊu sè j ®· cã trªn dßng i cha.
B[i,j]=True nghÜa lµ trªn dßng i cha cã sè j, ngîc l¹i B[i,j]=False
- M¶ng logic C[1..9,1..9] ®Ó ®¸nh dÊu sè j ®· cã trªn cét i cha.
B[i,j]=True nghÜa lµ trªn cét i cha cã sè j, ngîc l¹i C[i,j]=False
- M¶ng logic H[1..9,1..9] ®Ó ®¸nh dÊu sè j ®· cã trªn h×nh vu«ng
3x3 thø i cha. B[i,j]=True nghÜa lµ trªn h×nh i cha cã sè j, ngîc l¹i
B[i,j]=False. H×nh vu«ng thø nhÊt cã vÞ trÝ a[1..3,1..3], h×nh
vu«ng thø 2 cã vÞ trÝ a[1..3,4..6], …, h×nh vu«ng thø 9 cã vÞ trÝ
a[7..9,7..9]
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc chän sè ®iÒn vµo « thø k
Procedure Try(k:integer); {Chän sè ®iÒn vµo « thø k}
Var i, x, y, hk : integer;
Begin
Toado(k,x,y); {LÊy täa ®é cña « thø k, dßng lu vµo x, cét lu vµo y}
If A[x,y]=0 Then {¤ nµy ®· bÞ xãa}
Begin
hk := Hinh(x,y); {hk lµ chØ sè h×nh vu«ng 3x3 cha « (x,y)}
For i:=1 To 9 Do {XÐt c¸c ph¬ng ¸n chän}
If D[x,i] and C[y,i] and H[hk,i] Then {ChÊp nhËn ®îc i}
Begin
A[x,y] := i; D[x,i] := False; C[y,i]:=False; H[hk,i]:=False;
If k=N then TBKQ
Else Try(k+1);
D[x,i] := True; C[y,i]:=True; H[hk,i]:=True; {Hñy chän i}
End;
End
Else If k=N Then TBKQ
Else Try(k+1);
End;
- Thñ tôc lÊy täa ®é cña « thø k
Procedure Toado(k:integer; Var x,y : integer);
Begin
y := k mod 9; If y=0 then y:=9;
x := (k-y) div 9 + 1
End;
- Hµm x¸c ®Þnh h×nh vu«ng 3x3 cha « (x,y)
Function Hinh(x,y :integer): integer;
Begin
If x<4 then
If y<4 then hinh := 1 else if y<7 then hinh := 2 else hinh := 3
else if x<7 then
if y<4 then hinh := 4 else if y<7 then hinh := 5 else hinh := 6
else if y< 4 then hinh := 7 else if y<7 then hinh := 8 else hinh := 9;
End;
- Thñ tôc th«ng b¸o kÕt qu¶
Procedure TBKQ;
Var i,j : integer;
Begin
For i:=1 to 9 do
Begin
For j:=1 to 9 Do Writle(A[i,j]);
Writeln;
End;
Halt; {KÕt thóc ch¬ng tr×nh}
End;
- Thñ tôc ®äc d÷ liªu
Procedure Docdulieu; {D÷ liÖu vµo tõ bµn phÝm theo mÉu}
Var i,j : integer;
Begin
Fillchar(D,sizeof(D), True); C := D; H := D; {Khëi t¹o c¸c m¶ng}
For i:=1 To 9 Do For j:=1 to 9 Do
Begin
Write(‘NhËp sè t¹i « ‘,i,’,’, j,’ = ‘); Read(A[i,j]);
If A[i,j]>0 Then
Begin
D[i,A[i,j]] := False; {D¸nh dÊu sè A[i,j] ®· cã ë dßng thø i}
C[j,A[i,j] := False;
H[Hinh(i,j),A[i,j]] := Flase;
End;
End;
End;
- Ch¬ng tr×nh chÝnh
Docdulieu;
Try(1);

Bµi tËp 5. BiÓu thøc zero


Cho mét sè tù nhiªn N ≤ 9. Gi÷a c¸c sè tõ 1 ®Õn N h·y thªm vµo c¸c dÊu
+ vµ - sao cho kÕt qu¶ thu ®îc b»ng 0. H·y viÕt ch¬ng tr×nh t×m tÊt c¶ c¸c
kh¶ n¨ng cã thÓ.
VÝ dô:
N=7 KÕt qu¶:
1+2-3+4-5-6+7 = 0
1+2-3-4+5+6-7 = 0
1-2+3+4-5+6-7 = 0
1-2-3-4-5+6+7 = 0
1-23+4+5+6+7 = 0
1-23-45+67 = 0
NhËn xÐt: c¸c yÕu tè cña bµi to¸n cho phÐp sö dông thuËt to¸n quay
lui.
- TËp d÷ liÖu D : c¸c dÊu ‘+’, ‘-‘ hoÆc ‘ ‘ (dÊu trèng)
- Mét ph¬n ¸n ®iÒn c¸c dÊu lµ bé v = (v[1], v[2],..., v[j]) víi v[i] lµ
dÊu ®øng tríc sè i. VÝ dô 1-23-45+67 sÏ t¬ng øng víi bé v[1]= ‘ ‘,
v[2]= ‘-‘, v[3]= ‘ ‘, v[4] = ‘-‘, v[5]= ‘ ‘, v[6]= ‘+’, v[7]= ‘ ‘
- TÝnh chÊt P : v[i] chØ nhËn mét trong 3 gi¸ trÞ lµ ‘+’, ‘-‘ hoÆc ‘ ‘
- TÝnh chÊt Q: j=N vµ gi¸ trÞ c¸ch ®Æt = 0
X©y dùng c¸c kh¸i niÖm xuÊt hiÖn trong gi¶i thuËt
- Try(k): chän dÊu ®øng tríc sè k
- Ph¬ng ¸n chän: c¸c dÊu ‘+’, ‘-‘ hoÆc ‘ ‘
- ChÊp nhËn ®îc: mäi ph¬n ¸n i
- Thùc hiÖn bíc chän: ®¸nh dÊu chän dÊu i cho bíc chän k
- Hñy chän: kh«ng cÇn
Tæ chøc d÷ liÖu
- M¶ng kÝ tù V[1..9] ®Ó lu c¸c dÊu chän ®Æt tríc c¸c sè.
- M¶ng h»ng x©u P[1..3]=(‘+’,’-‘,’ ‘) x¸c ®Þnh c¸c ph¬ng ¸n chän
Gi¶i thuËt cô thÓ trªn tæ chøc d÷ liÖu ®· nªu
- Thñ tôc chän dÊu ®iÒn tríc sè k
Procedure Try(k:integer);
Var i : integer;
Begin
For i:=1 to 3 Do {XÐt c¸c ph¬ng ¸n chän}
Begin
V[k] := P[i]; {§Æt dÊu P[i] tríc sè k}
If (k=N)and (GiaTriCachDat = 0) Then TBKQ
Else Try(k+1);
End;
End;
- Hµm tÝnh gi¸ trÞ c¸ch ®Æt
Function GiaTriCachDat : longint;
Var T, So : longint; i,j,v : integer;
Begin
T := 0; i := n+1;
Repeat
j := i-1;
i := j; While (V[i]=’ ‘)and(i-1>0) Do i := i -1;
So := 0; For v:=i To j Do So := So*10 + v;
If V[i] = ‘-‘ Then T := T – So Else T := T + So;
Until j=0;
GiaTriCachDat := T;
End;
- Thñ tôc th«ng b¸o kÕt qu¶ ra mµn h×nh
Procedure TBKQ;
Var i : integer;
Begin
For i:=1 To N Do
Begin
If V[i]= ‘ ‘ Then write(‘’) Else Write(V[i]);
Write(V[i]);
End;
Writeln;
End;
- Ch¬ng tr×nh chÝnh
Readln(N);
V[1]:=’ ‘; Try(2);

2. Mét sè bµi tËp ¸p dông

Bµi 1: Robot quÐt v«i


Cã 9 c¨n phßng (®¸nh sè tõ 1 ®Õn 9) ®· ®îc quÐt v«i víi mµu tr¾ng,
xanh hoÆc vµng. Cã 9 robot (®¸nh sè tõ 1 ®Õn 9) phô tr¸ch viÖc quÐt v«i
c¸c phßng. Mçi robot chØ quÐt v«i mét sè phßng nhÊt ®Þnh. ViÖc quÐt
v«i ®îc thùc hiÖn nhê mét ch¬ng tr×nh ®îc cµi ®Æt s½n theo quy t¾c:
NÕu phßng cã mµu tr¾ng th× quÐt mµu xanh
NÕu phßng ®ang cã mµu xanh th× quÐt mµu vµng
NÕu phßng ®ang cã mµu vµng th× quÐt mµu tr¾ng
CÇn ph¶i gäi lÇn lît c¸c robot ra quÐt v«i (mçi lÇn mét robot, mçi robot
cã thÓ ®îc gäi nhiÒu lÇn vµ cã thÓ cã robot kh«ng ®îc gäi. Robot sÏ quÐt
tÊt c¶ c¸c phßng mµ nã phô tr¸ch) ®Ó c¸c phßng cuèi cïng ®Òu cã mµu
tr¾ng.
ViÕt ch¬ng tr×nh:
§äc danh s¸ch nhiÖm vô c¸c robot vµ t×nh tr¹ng c¸c phßng tõ file Input
T×m mét ph¬ng ¸n quÐt sao cho lîng v«i ph¶i sö dông lµ Ýt nhÊt víi gi¶
thiÕt lîng v«i cho mçi lît quÐt ®èi víi c¸c phßng lµ 1 ®¬n vÞ nh nhau
Ghi kÕt qu¶ t×m ®îc ra file Output
Input: file v¨n b¶n ROBOT.INP
9 dßng ®Çu, mçi dßng i ghi sè hiÖu c¸c phßng mµ robot i ®îc phô tr¸ch
quÐt v«i, c¸c sè hiÖu viÕt s¸t nhau
Dßng cuèi gåm 9 ký tù viÕt s¸t nhau, ký tù thø i biÓu diÔn mµu v«i cña
phßng thø i víi quy íc: ký tù T chØ mµu tr¾ng, ký tù X chØ mµu xanh, ký
tù V chØ mµu vµng
Output: file v¨n b¶n ROBOT.OUT
NÕu kh«ng cã mét ph¬ng ¸n th× ghi mét ch÷ sè 0
Tr¸i l¹i dßng 1 ghi sè ®¬n vÞ v«i cÇn sö dông, dßng 2 ghi d·y thø tù c¸c
robot ®îc gäi (c¸c sè hiÖu robot viÕt s¸t nhau)
VÝ dô:
ROBOT.INP ROBOT.OU
T
159 17
123 2255799
357
147
5
369
456
789
258
XVXVXVTX
T

Bµi 2: D·y ®o¹n con dµi nhÊt cã tæng chia hÕt cho mét sè
Cho mét d·y gåm n (0  n  1000) sè nguyªn d¬ng a1, a2,..., an vµ sè
nguyªn d¬ng k (k  50)
ViÕt ch¬ng tr×nh:
§äc d·y sè nguyªn tõ file Input
T×m d·y con nhiÒu phÇn tö nhÊt cña d·y ®· cho mµ tæng c¸c phÇn tö
chia hÕt cho k
Ghi kÕt qu¶ ra file Output
Input: file v¨n b¶n DAY_K.INP
Dßng ®Çu tiªn chøa sè n vµ k ®îc ghi Ýt nhÊt mét dÊu c¸ch
C¸c dßng tiÕp theo chøa c¸c sè a 1, a2,..., ap ®îc ghi c¸ch nhau Ýt nhÊt
mét dÊu c¸ch hoÆc xuèng mét dßng
Output: file v¨n b¶n DAY_K.OUT
Dßng ®Çu tiªn ghi sè m lµ sè phÇn tö cña d·y con t×m ®îc
C¸c dßng tiÕp theo ghi d·y m chØ sè c¸c phÇn tö cña d·y ®· cho cã mÆt
trong d·y con t×m ®îc. C¸c sè c¸ch nhau Ýt nhÊt mét dÊu c¸ch hoÆc xuèng
dßng.
VÝ dô:
DAY_K.I DAY_K.OUT
NP
10 3 9
357 1 345
9 6 12 7 6 7 8 9 10
11 17 15

Bµi 3: B¶ng qu¶ng c¸o


Trªn qu¶ng trêng trung t©m thµnh phè cã mét b¶ng qu¶ng c¸o h×nh ch÷
nhËt gåm MxN « vu«ng. Trong mçi « ®îc g¾n mét bãng ®Ìn, mçi bãng ®Ìn
cã 2 tr¸ng th¸i: t¾t hoÆc s¸ng, øng víi mçi dßng vµ mét cét cã mét c«ng t¾c.
Khi t¸c ®éng lªn mét c«ng t¾c th× tÊt c¶ c¸c ®Ìn trªn dßng hay cét t¬ng øng
sÏ ®æi sang tr¹ng th¸i ngîc l¹i (®ang t¾t thµnh s¸ng, ®ang s¸ng thµnh t¾t).
§Ó chµo mõng ®éi nhµ th¾ng trËn, ngêi phô tr¸ch b¶ng qu¶ng c¸o
muèn cho nhiÒu bãng s¸ng nhÊt víi tr¹ng th¸i b¶ng qu¶ng c¸o hiÖn thêi ®·
biÕt.
ViÕt ch¬ng tr×nh
§äc d÷ liÖu tõ file Input
T×m mét ph¬ng ¸n t¸c ®éng lªn c¸c c«ng t¾c ®Ó nhËn ®îc tr¹ng th¸i
b¶ng qu¶ng c¸o nh ngêi phô tr¸ch mong muèn
Ghi kÕt qu¶ file Output
Input: file v¨n b¶n QUANGCAO.INP
Dßng 1 chøa 2 sè M vµ N (1  N  10, 1  M  100)
Dßng thø i trong sè N dßng tiÕp theo chøa M sè 0 hoÆc 1 c¸ch nhau Ýt
nhÊt m«t dÊu c¸ch, sè thø j cho biÕt tr¹ng th¸i ®Ìn thø j tren dßng i (j=0 t-
¬ng øng ®Ìn j t¾t, j=1 t¬ng øng ®Ìn j s¸ng)
Output: file v¨n b¶n QUANGCAO.OUT
Dßng 1: ghi sè lîng bãng ®Ìn s¸ng trªn b¶ng
Dßng 2: ghi S lµ sè lîng lÇn t¸c ®éng lªn c¸c c«ng t¾c
S dßng tiÕp theo ghi S c«ng t¾c theo tuÇn tù bËt, ký tù ®Çu lµ ‘D’
hoÆc ‘S’ t¬ng øng víi c«ng t¾c ë dßng hoÆc cét, c¸c ký tù tiÕp theo ghi
chØ sè dßng vµ chØ sè cét t¬ng øng víi c¸c lÇn t¸c ®éng
VÝ dô
QUANGCAO. QUANGCAO.
INP OUT
44 16
1001 4
0110 C2
0110 C3
1001 D2
D3

Bµi 4: Tõ chuÈn
Mét tõ 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
tiÕp nhau mµ gièng nhau.
H·y t×m tÊt c¶ c¸c tõ chuÈn lo¹i M cã chiÒu dµi N
D÷ liÖu vµo: ®äc tõ file v¨n b¶n TUCHUAN.INP lÇn lît 2 sè M, N
KÕt qu¶: ghi ra file v¨n b¶n TUCHUAN.OUT, mçi dßng ghi mét tõ t×m
®îc.
- Giíi h¹n: 2<=M<=3; 1<=N<=40000
VÝ dô:
TUCHUAN.INP TUCHUAN.OUT
23 121
212

Bµi 5. Xoay «.
Cho mét h×nh vu«ng gåm n*n «, mçi « nhËn ®îc mét trong 4 tr¹ng th¸i
sau:

Tr¹ng th¸i cña mçi « cã thÓ thay ®æi b»ng c¸ch xoay « ®ã theo chiÒu
kim ®ång hå mét trong nh÷ng gãc 90o, 180o, 270o.
Mét h×nh vu«ng ®îc gäi lµ hîp lÖ nÕu trong h×nh vu«ng bÊt kú 2 «
chung c¹nh th× kh«ng chung mµu.
VÝ dô:
Yªu cÇu: T×m c¸ch xoay Ýt « nhÊt ®Ó h×nh vu«ng ®· cho trë thµnh
hîp lÖ.
D÷ liÖu vµo: XOAY.INP
Dßng ®Çu gåm n dßng, n dßng tiÕp theo mçi dßng ghi tr¹ng th¸i cña
h×nh ch÷ nhËt.
KÕt qu¶: Ghi ra fiel XOAY.OUT
NÕu kh«ng cÇn xoay th× ghi 0. Ngîc l¹i ghi m lµ sè « cÇn xoay m dßng
tiÕp theo mçi dßng ghi to¹ ®é « cÇn xoay vµ gãc xoay.
VÝ dô:
XOAY. XOAY.
INP OUT
4 6
2010 1 1 270
2032 2 1 270
2023 2 3 180
1210 2 4 180
3 2 270
4 2 180.

You might also like