Professional Documents
Culture Documents
CD Dequyquaylui
CD Dequyquaylui
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
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);
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);
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 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 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.