You are on page 1of 18

[Thut ton] Loang trn ma trn -------------------------------------------------THUT TON LOANG TRN MA TRN (DY 2 CHIU) ------T tng ca thut

ton loang tht ra cng rt n gin. Hy tng tng c mt nng cng cha b bt giam vo 1 m cung, nng b qu, li TD ra fone cho hong t. Hong t tc tc dn theo mt o qun (gi s rng s qun ca chng ta l ko gii hn). Khi n cng vo m cung, chng may mn gp mt "bc thnh nhn", ngi cho chng bit rng cng cha ang b giam trong phng [X,Y] no . , by gi trong u chng ngh n 2 hng sau: _ Chng quyt nh solo i vo m cung, d nhin trn tay cm 1 cun ch. Khi vo cng, chng bt gp T cn phng, chng s i vo tng phng mt, bc vo T1, chng li gp T2 ca, ... , c th n khi ko c ng i, chng s ln ngc theo ng ch, nh du vo cnh ca chng i ri, v chn 1 ca khc. Vi cch ny, chng s tm c phng c cng cha, d nhin, nu chng ko gc gia ng. _ Tn dng ngun binh lc hng hu ca mnh, chng ra hiu lnh "Ton lc lc sot". i vo m cung, bt gp T cn phng, chng chia on binh thnh T o, c th. D nhin, mi binh s u c trang b phng tin lin lc khi tm thy cng cha s pht hiu lnh "Rt lui". Vy, vi cch ny ta s tm c cng cha vi qung ng i t ca m cung n phng giam l ngn nht. Nhng, ny sinh mt bt cp l, nu binh s tm c cng cha ri, th lm sao ln ra li ca m cung y??? ng nhin hong t ko th chp nhn chuyn ngi yu mnh chung phng vi mt m binh s ~~. Chng ra lnh rng, trc khi vo mi ca, phi dng kim vch mi tn xung t, mi tn ny s hng n ca cc binh s i vo trc khi gp cn phng. V d khi vo cng m cung, 1 tp binh s i vo ca T1, gp N2 ca khc, chia binh lc ra, vi mi ca T2, cc binh s s vch mi tn hng v ca T1, tc ca dn h ti N2 cn phng. Nh h s ln c ng thot khi m cung. T y, ta s hnh thnh 2 phng php tm ng i, trong bi vit ny, chng ta s tm hiu cch th hai, m theo cch gi thng thng l LOANG: T mt v tr c ta A(x,y) cho sn, bn buc phi tm n mt v tr B(x,y) sao cho qung ng i l t nht c th v in ra ng i t A n B . ------C kh nhiu phng php tm ng i, trong c BFS (Breadth First Search - Tm kim theo chiu rng, cn gi l loang), DFS (Depth First Search - Tm kim theo chiu su). Nh ni, chng ta ch xem xt vBFS trong bi vit ny. C nhiu cch ci t BFS nh l hng i (queue) hoc dng 2 mng tnh qua li ln nhau (mng cha nhng phng c th i tip, v mng cha nhng phng bt gp khi i vo nhng phng trn). Tuy nhin cc m ti sp gii thiu cho bn y l mt cch khng chnh thng, phng php ny loang theo chiu rng v cch thc tn kh nhiu ti nguyn. Song, vi thut ton Loang ny, bn s d dng lm nhng bi ton Loang n gin hay phc tp vi d liu yu cu nh. Thut ton c trnh by ngn gn nh sau: ------C mt ni bn t chn ti v thy l ni cho php th nh du ni vi 1 s [i]k tng dn ( xc nh rng bn i n v l ni bn i n ln th k). C tip tc nh th cho n khi gp im dng th thot khi chng trnh. var a Near : array[1..100,1..100] of byte; khai bo m ng ki u d li u s nguyn m c : array[1..2] of record khai bo m ng ki u b n ghi x,y : byte; end; Procedure Loang; Var i,j,z : byte; Begin Repeat {Kim tra nu phn t cui cng a[n,m] khc 0 (gp im dng) th s kt thc, ngc li th lm nhng cng vic sau } Flag := false; {Hin ti, cha tm c ch loang} For i := 1 to n do For j := 1 to m do {Duyt tt c phn t mng} Begin If (a[i,j] = e) then Begin {To nhng phn t xung quanh i,j. y ti lm di v phi} Near[1].x := i+1; Near[1].y := j; {Nu pht hin c du chn c nh du ti bc loang th e th bt u loang tip}

Near[2].x := i;

Near[2].y := j+1;

For z := 1 to 2 do {Bt u duyt cc phn t xung quanh } Begin If (a[Near[z].x,Near[z].y] = 0) then {Nu k gp chng ngi vt} trong bi ton m i tun} Begin Flag := true; { tm c ch loang} a[Near[z].x,Near[z].y] := e+1; {nh du chn loang ti m c bc th e + 1} End; End; End; End; If Flag then e := e+1; (Near l mng hng ging nh

Until a[n,m] <> 0; End; BEGIN ReadInput; e := 1; Loang; Print; Readln; END. Thc t cho thy, kt qu ca bi ton s in ra 1 ma trn c loang "t l". Bi v bn khng kim sot v cho bit mt ng loang nht nh, do t 1 bc s c nhiu hng i. Okay, gii quyt vn ny, cng vic ch cn l bn. Ti cung cp cho bn cch Loang ra ton ma trn, nhim v ca bn by gi l hy dng cch tng t vit mt th tc xa nhng Loang d tha, khng cn thit. Vd: Trch dn: Ma trn gc: 00101 00011 00001 00000 Ma trn Loang: 12101 23411 34561 45678

Ma trn xa Loang d: 10101 20011 30001 45678

Xong. Thut ton ci t kh n gin v chy kh hiu qu, tuy nhin thi gian kh chm do phc tp tng O(k*n^2). Bn c th thm mt cht ci tin ci thin tc . Bi 1 : Tm dy con tng di nht : Cho mng A(N) . Cn xo t nht mt s phn t ca dy ny sao cho cc phn t cn li to thnh dy tng nghim ngt . Ta xy dng mng T(N) v mng D(N) vi ngha : + T[i] l ch s j ( trong mng A ) ca phn t ng trc phn t c ch s i (trong mng A ) khi xt dy kt qu . + D[i] l di ca dy kt qu khi bi ton trn mng A(N) mi c xt t phn t 1 n phn t i ( Nghi l ta tm gii bi ton vi kch thc n i - l kch thc khng vt qu kch thc bi ton cho ) . Cng thc qui hoch ng ca bi ton ny l : D[i] = Max { D[j] + 1 / " j : j <i m A[j] < A[i] } Ch 1- Khi tr bi ton : T[1] = 0 , D[1] = 1 2- X dng cng thc trn vi i>1 , mi ln tm c j tho mn cn ghi lu T[i]=j 3- Khi xong i=N , tm li kt qu nh duyt mng D . Trc ht tm j c D[j] ln nht , sau truy hi dn tm j bng cch thay j bi T[j] cho n khi T[j]=0 Cc v tr j tm c chnh l cc v tr trong mng A cn gi li nhng theo th t ngc . Th d Ch s 1 2 3 4 5 6 7 8 9 10 11 12 A 6 12 8 11 3 4 1 7 5 9 10 2 T 0 1 1 3 0 5 0 6 6 8 10 7 D 1 2 2 3 -1 -2 1 -3 3 -4 -5 2 Dy kt qu l : Ch s 5 6 8 10 11 A 3 4 7 9 10 Bi 2 : Xo t nht mt s phn t ca 2 dy sao cho sau khi xo 2 dy nh nhau Gi : Cn xy dng mng C(N,M) vi ngha : C[i,j] l di ca dy cn li nu dy A ch xt ti ch s i v dy B ch xt ti ch s j . ng nhin C[1,j] = 0 nu A[1] khng c trong dy B(j) ,ngc li th C[1,j] = 1 ; tng t C[i,1] = 0 nu B[1] khng c trong dy A(i) ,ngc li th C[i,1] = 1 . Nhng trng hp cn li C[i,j] c tnh theo cng thc truy hi sau : C[i,j] = Max{C[i,j-1],C[i-1,j],C[i-1,j-1]+x} ( V : nu A[i]=B[j] th C[i,j]= C[i-1,j-1]+1 nu A[i] khng c trong B(j) th C[i,j]= C[i-1,j] nu B[j] khng c trong A(i) th C[i,j]= C[i,j-1] ) A - Li gii Bi 1 : {Cho N nguyen duong N<=10000 so , tim day tang dai nhat } Uses Crt; Const Max = 10000; {Khai bo bin khng i} Fi = 'BL14.inp'; {To file nhp} Fo = 'BL1.out'; {File xut} Type Mang = Array[1..Max] of Integer; Var A,D,T : Mang; N,dem : LongInt; F : Text; Procedure TaoF; Var F : Text; i : LongInt; Begin Assign(F,Fi);M tp tin c tn l Fi ReWrite(F);

Write('Nhap N = '); Repeat {$I-} Readln(N);{$I+} Until (IoResult=0) and (N>0) and (N<=Max); Writeln(F,N); For i:=1 to N do Begin Write(F,10000-i+1:7); {Write(F,Random(100):3);} If i mod 10 =0 then Writeln(F); End; Close(F); End; Procedure Nhap; Var i : LongInt; Begin FillChar(A,Sizeof(A),0); (FillChar in mt s byte c gi tr vo; Sizeof: cho kch thc ca bin hay kiu d liu) Assign(F,Fi); Reset(F); Readln(F,N); For i:=1 to N do Read(F,A[i]);

Close(F); End; Procedure KhoitriT_D; Begin FillChar(T,Sizeof(T),0); T[1] := 0; D[1] := 1; End; Function Vitritruoc(i : LongInt) : LongInt; Var j,Ld,Lj : LongInt; Begin Ld := 0; Lj := 0; Vitritruoc := 0; For j:=i-1 downto 1 do If A[j]<=A[i] then If D[j]>Ld then Begin Ld := D[j]; Lj := j; End; Vitritruoc := Lj; End; Procedure TaoT_D; Var i : LongInt; Begin KhoitriT_Dl; For i:=2 to N do Begin T[i] := Vitritruoc(i); If T[i]=0 then D[i] := 1 Else D[i] := D[T[i]]+1; End; End; Function MaxD : Longint; Var i,p,Li : LongInt; Begin p := -MaxInt; Li := 0; For i:=1 to N do If D[i]>p then Begin p := D[i]; Li := i; End; MaxD := Li; End; Procedure Timketqua; Var i : LongInt; Begin i := MaxD; D[i] := -D[i]; dem := 1; Repeat i := T[i]; If i<>0 then Begin D[i] := -D[i];

Inc(dem) End; Until i=0; End; Procedure Ghi; Var F : Text; i : LongInt; Begin Assign(F,Fo); ReWrite(F); Writeln(F,dem); dem := 0; For i := 1 to N do If D[i]<0 then Begin Write(F,A[i]:7); Inc(dem); If dem mod 10 = 0 then Writeln(F); End; Close(F); End; BEGIN Clrscr; {TaoF;} Nhap; TaoT_D; Timketqua; Ghi; Writeln('Da xong '); Readln; END. Bi 2 : Uses Crt; Const Max = 100; Fi = 'qhdong2.inp'; Fo = 'qhdong2.out'; Type M1 = Array[1..Max] of Byte; M2 = Array[1..Max,1..Max] of Byte; Var A,B : M1; C : M2; F,F2 : Text; M,N : Byte; Procedure TaoF; Var i : Byte; F : Text; Begin Write('Nhap do dai 2 mang : M,N = '); Readln(M,N); Assign(F,Fi); ReWrite(F); Writeln(F,M,' ',N); For i:=1 to M do Write(F,Random(100+1),' '); Writeln(F); For i:=1 to N do Write(F,Random(100+1),' '); Close(f); End; Procedure DocF; Var i : Byte;

Begin Assign(F,Fi); Reset(F); Readln(F,M,N); For i:=1 to M do Read(F,A[i]); Readln(F); For i:=1 to N do Read(F,B[i]); Close(F); End;

Function Max3(x,y,z : Byte) : Byte; Var phu : Byte; Begin If x>y then phu := x Else phu := y; If z>phu then phu := z; Max3 := Phu; End; Function Co(x,L : Integer;D : M1) : Boolean;

Var

: Byte;

Bi 1 cho xu S ( di khng vt qu 10) ch gm cc k t 'A' n 'Z', cc k t i 1 khc nhau. hy lit k cc hon v khc nhau ca xu S D liu vo: nhp t file HVX.INP gm 1 dng duy nht l xu S D li ra: Ghi ra file HVX.OUT gm nhiu dng, mi dng l 1 hon v ca xu S Bi 2 Cho s nguyn dng n (n<=20). hy lit k tt c cc xu di n ch gm 2 k t 'A' v 'B' sao cho ko c 2 k t 'B' no ng cnh nhau. D liu vo: nhp t file AB.INP gm 1 dng duy nht ghi s nguyn dng n D liu ra: Ghi ra file AB.OUT gm nhiu dng, mi dng l 1 xu di n tm c Bi 3 Cho dy s A gm n ( n<=10) s nguyn A1 ,A2, . . ,An v 1 s nguyn dng k ( 1<k<n) Hy a ra 1 cch chia dy s thnh k nhm sao cho cc nhm c tng bng nhau. D liu vo: Nhp t file CHIA.INP gm dng u tin cha s nguyn n v k; dng sau cha dy s nguyn A D liu ra: Ghi ra file CHIA.OUT gm k dng, mi dng l 1 nhm. Bi 4 ( lm cng c. h ) 1 xu X = x1,x2,...,xm c gi l xu con ca xu Y = y1,y2,...,yn. Nu ta c th nhn c xu X t xu Y bng cch xa i 1 s k t, tc l tn ti 1 dy cc ch s: 1<=i1<i2<...<im<= n x1=yi, x2 = yi,..., xm = yi. V d X = 'adz' l xu con ca Y = 'baczdtz', i1 = 2 < i2 = 5 < i3 = 7. Bai 1 Program hoanvi; Uses crt; Const maxLS = 255; Var s,t:string; ls:integer; bo: array [1..maxLS] of boolean; i:integer; F:text; {-----------------------------------------------------------------------} Procedure hvi(n:integer); Var i:integer; c:char; Begin If (n = 0) then Begin Writeln(F,t); Exit; End; For i:=1 to ls do If bo[i] then Begin bo[i]:=False; t[n]:=s[i]; hvi(n-1); bo[i]:=True;

End; End; {-----------------------------------------------------------------------} BEGIN Clrscr; Assign(F,'HVX.INP'); Reset(F); Read(F,s); Close(F); Assign(F,'HVX.OUT'); Rewrite(F); t:=s; ls:=length(s); For i:=1 to ls do bo[i]:=true; hvi(ls); Close(F); END. Bai 2 Var B:array[1..100] of char; n:integer;Procedure printresult; Var j:integer;check:boolean; n-1 do Begin check:=true; For j:=1 to

fi = 'CHIA.INP'; fo = 'CHIA.OUT'; var n,k:integer; a:array[1..10] of integer; t:array[1..10] of integer; writeln; End; dd:array[1..10] of byte; s:longint; {_} procedure bt(i:integer); var j:integer; f:text; begin if (i>n) then begin assign(f,fo); rewrite(f); for i:=1 to k do begin for j:=1 to n do if dd[j] = i then write(f,a[j],#32); writeln(f); end;

if (B[j]='B') and (B[j+1]='B') then check:=false; For j:=1 to n do if check=true then write(B[j]);

Procedure done(i:integer); Var j:char; Begin For j:='A' to 'B' do Begin B[i]:=j;

if i=n then printresult else End; done(1); readln; End. Bai 3 program chia_day; const done(i+1); End;Begin write('n='); readln(n);

close(f); halt; end; for j:=1 to k do if t[j]+a[i] <= s div k then begin t[j]:=t[j]+a[i]; dd[i]:=j; bt(i+1); t[j]:=t[j]-a[i]; dd[i]:=0; end; end; {_} procedure NoSolution; var f:text; begin assign(f,fo); rewrite(f); writeln(f,'NO SOLUTION'); close(f); end; {_} procedure enter; . Bai 4 program xau_con; var x,y:string; {_} procedure enter; begin readln(x); readln(y); end; {_} function solve:boolean;

var f:text; i:byte; begin assign(f,fi); {$i-} reset(f); if (ioresult<>0) then begin writeln('file not found'); readln; halt; end; readln(f,n,k); s:=0; for i:=1 to n do begin read(a[i]); s:=s+a[i]; end; close(f); fillchar(t,sizeof(t),0); fillchar(dd,sizeof(dd),0); end; {_} begin enter; bt(1); NoSolution; end

var i,j:integer; find:boolean; begin for i:=1 to length(x) do begin find:=false; for j:=1 to length(y) do if x[i]=x[j] then begin delete(y,1,j); find:=true; break; end; if (not find) then exit(false); end; exit(true); end; {_}

procedure output; begin writeln(solve); end; {_} begin enter; output; end. Code bai 2 Program bai2; const fi = 'AB.INP'; fo = 'AB.OUT'; Var B:array[1..100] of char; n:integer; f: text; {---------------------------------------------} Procedure In_kq; Var j: integer; kt: boolean; Begin kt:= true; For j:=1 to n-1 do if (B[j] = 'B') and (B[j+1] = 'B') then kt:=false; if (kt = true) then .Bi 1.

Begin For j:=1 to n do write(f,B[j]); writeln(f); end; End; {---------------------------------------------} Procedure done(i:integer); Var j:char; Begin For j:='A' to 'B' do Begin B[i]:=j; if i=n then In_kq else done(i+1); End; End; {---------------------------------------------} Begin Assign(f,fi); Reset(f); Read(f,n); Close(f); Assign(f,fo); Rewrite(f); done(1); close(f) End

Cho th v hng G. Hy tm s thnh phn lin thng ca th. Hng dn: Thc hin tm kim t nh s bng thhur tc DFS(s) hoc BFS(s). Cc nh thm c t s phi cng mt vng lin thng vi s nn tt c nh ny c ghi nhn vi cng mt s hiu vng lin thng. Trong chng trnh bn di, th c biu din bng ma trn k a, mng ghi nhn s hiu vng lin thng ca cc nh l v v sv cho bit s lng vng lin thng. Chng trnh: program lien_thong_DFS; uses crt; const max=100; fi='STPLT.INP'; fo='STPLT.OUT'; type m1=array[0..max] of integer; m2=array[1..max,1..max] of 0..1;

var a:m2; v:m1; n,sv:integer; procedure input; var f:text; i,j,k:integer; begin assign(f,fi); reset(f); readln(f,n); fillchar(a,sizeof(a),0); for i:=1 to n do begin for j:=1 to n do read(f,a[i,j]); readln(f); end; close(f); end; procedure DFS(i:integer); var j:integer; begin for j:=1 to n do if (v[j]=0) and (a[i,j]=1) then begin v[j]:=sv; DFS(j); end; end; procedure Xuly; var s:integer; begin fillchar(v,sizeof(v),0); sv:=0; for s:=1 to n do if v[s]=0 then begin inc(sv); v[s]:=sv; DFS(s); end; end; procedure output; var f:text; i,j:integer; begin assign(f,fo); rewrite(f); writeln(f,sv); for i:=1 to sv do begin for j:=1 to n do if v[j]=i then write(f,j,' '); writeln(f); end; close(f); end; BEGIN input; Xuly; output; END. Trong chng trnh trn nu thay th tc DFS(s) bng th tc BFS(s) kt qu hon ton tng t nhau.program lien_thong_BFS; uses crt; const max=100; fi='stplt.inp'; fo='stplt2.out'; type m1=array[0..max] of integer; m2=array[1..max,1..max] of 0..1; var a:m2; v,q:m1; n,sv,dau,cuoi:integer; procedure input; var f:text; i,j,k:integer; begin assign(f,fi); reset(f); readln(f,n); fillchar(a,sizeof(a),0); for i:=1 to n do

begin for j:=1 to n do read(f,a[i,j]); readln(f); end; close(f); end; procedure empty; begin dau:=1; cuoi:=0; end; procedure add(s:integer); begin inc(cuoi); q[cuoi]:=s; end; procedure get(var s:integer); begin s:=q[dau]; inc(dau); end; procedure BFS(i:integer); var x,y:integer; begin empty; add(i); while (cuoi>=dau) do begin get(x); for y:=1 to n do if (a[x,y]=1) and (v[y]=0) then begin v[y]:=sv; add(y); end; end; end; procedure Xuly; var s:integer; begin fillchar(v,sizeof(v),0); sv:=0; for s:=1 to n do if v[s]=0 then begin inc(sv); v[s]:=sv; BFS(s); end; end; procedure output; var f:text; i,j:integer; begin assign(f,fo); rewrite(f); writeln(f,sv); for i:=1 to sv do

begin end; for j:=1 to n do BEGIN if v[j]=i then write(f,j,' '); input; writeln(f); Xuly; end; output; close(f); END. .Bi 2. trang tri ca ng An, mi khi ng ng say l lc si n n tht cu ca ng. Trang tri hnh ch nht gm cc c t chc thnh hng v ct. Trn bn th hin trang tri c cc k hiu: k t . l rng, k t # l hng ro, k t o l cu v v l ch si. Hai c xem l cng mt min nu ta di chuyn t ny sang khc bng ng i theo chiu ngang hoc dc v khng c ro cn. Cc m t c th thot khi trang tri khng c xem l mt phn ca bt k min no. Cu s git c si nu s lng ca chng ln hn s lng si trong cng min. Ngc li, si s n tht tt c cu trong min. Ban u, tt c cu v si u trong cc min ca trang tri. Vit chng trnh m s cu v s si cn sng st vo bui sng hm sau . D liu vo:file vn bn SOICUU.INP gm: - Dng u cha 2 s nguyn R v C, 3 R, C 250, l s dng v s ct ca trang tri. - Trong R dng tip theo mi dng C k t theo qui c trong bn trang tri cho bit v tr ca rng, ro cn, cu v si. D liu ra: file vn bn SOICUU.OUT gm mt dng duy nht cha hai s, s cu v s si cn sng n bui sng hm sau. Th d: SOICUU.INP 3 1 SOICUU.OUT SOICUU.INP 3 5 SOICUU.OUT

Hng dn: Dng thut ton tm kim xc nh cc min lin thng. Trong mi min lin thng m s cu v s si trong . Nu s cu ln hn s si th coi nh s si cn li trong min ny bng 0, ngc li s cu cn li trong min ny bng 0. Khi tm kim ti no th xa bng cch gn k t # trn .Chng trnh: program dem_soi_cuu;
const MAXN = 500; MAXM = MAXN; MAXQ = MAXN*MAXM; fi='DEM.INP'; fo='DEM.OUT';var A : array[0..MAXN+1, 0..MAXM+1] of char; n, m, i, j, x, y, socuu, sosoi, tsosoi, tsocuu : longint; qx : array[0..MAXQ] of longint; qy : array[0..MAXQ] of longint; qp, qk : longint; f,g:text; procedure input; var i,j:integer; begin assign(f,fi); reset(f); readln(f,n,m); for i:=1 to n do begin for j:=1 to m do read(f,a[i,j]); readln(f); end; close(f); end;procedure push(x, y : longint); begin qx[qp]:=x; qy[qp]:=y; if qp<MAXQ then qp:=qp+1 else qp:=0; end;procedure pop(var x, y : longint); begin x:=qx[qk]; y:=qy[qk]; if qk<MAXQ then qk:=qk+1 else qk:=0; end;procedure Duyet(x, y : longint); begin if A[x, y]<>'#' then begin push(x, y); if A[x, y]='v' then sosoi:=sosoi+1 else if A[x, y]='o' then socuu:=socuu+1; A[x, y]:='#'; end; end;begin input; qp:=0; qk:=0; tsosoi:=0; tsocuu:=0; for i:=1 to n do for j:=1 to m do if (A[i, j]='v')or(A[i, j]='o') then begin socuu:=0; sosoi:=0; Duyet(i, j); while qp<>qk do begin pop(x, y);

Duyet(x+1, y); Duyet(x, y+1); Duyet(x-1, y); Duyet(x, y-1); end; if socuu>sosoi then sosoi:=0 else socuu:=0; tsocuu:=tsocuu+socuu;

tsosoi:=tsosoi+sosoi; end; assign(g,fo); rewrite(g); writeln(g,tsocuu, ' ', tsosoi); close(g); end.

Bi 3. ng i n s 0 Mi mt s nguyn dng u c th biu din di dng tch ca 2 s nguyn dng X,Y sao cho X<=Y. Nu nh trong phn tch ny ta thay X bi X-1 cn Y bi Y+1 th sau khi tnh tch ca chng ta thu c hoc l mt s nguyn dng mi hoc l s 0. V D : S 12 c 3 cch phn tch 1*12, 3*4, 2*6. Cch phn tch th nht cho ta tch mi l 0: (1-1)*(12+1) = 0, cch phn tch th hai cho ta tch mi 10: (3-1)*(4+1) = 10, cn cch phn tch th ba cho ta 7: (2-1)*(6+1)=7. Nu nh kt qu l khc khng ta li lp li th tc ny i vi s thu c. R rng p dng lin tip th tc trn, cui cng ta s n c s 0, khng ph thuc vo vic ta chn cch phn tch no tip tc. Yu cu :Cho trc s nguyn dng N (1<=N<=10000), hy a ra tt c cc s nguyn dng khc nhau c th gp trong vic p dng th tc m t i vi N. D liu vo : t file vn bn ZERO.INP cha s nguyn dng N. Kt qu : Ghi ra file vn bn ZERO.OUT: - Dng u tin ghi K l s lng s tm c - Dng tip theo cha K s tm c theo th t tng dn bt u t s 0 . Lu : C th c s xut hin trn nhiu ng bin i khc nhau, nhng n ch c tnh mt ln trong kt qu . Th d : ZERO.INP ZERO.OUT 12 6 0 3 4 6 7 10 Hng Dn : n gin l sau mi ln phn tch th chc chn kt qu mi lun nh hn s . V vy ta ch cn lu tr di mng A: [0..10000] of boolean ; trong A[i]=true nu n xut hin trn ng i , ngc li th A[i]=false . Bng cch loang theo chiu su, chng ta s nh du cc s nu n c dng n, cho n khi khng th no loang c na th dng . Chng trnh: uses crt; const tfi='ZERO.INP'; tfo='ZERO.OUT'; maxN=10000; var fi,fo: text; N: integer; dd: array[0..maxN] of byte; procedure Docdl; begin assign(fi,tfi); reset(fi); readln(fi,N); close(fi); end; procedure Loang(u: integer); var x,y: integer; begin if u>0 then begin for x:=1 to trunc(sqrt(u)) do if u mod x=0 then begin y:=u div x; if dd[(x-1)*(y+1)]=0 then begin dd[(x-1)*(y+1)]:=1; Loang((x-1)*(y+1)); end; end; Bi 4. Chuyn bi end; end; procedure Tim; begin fillchar(dd,sizeof(dd),0); Loang(N); end; procedure Inkq; var dem,sol,i: integer; begin sol:=0; for i:=0 to N do sol:=sol+dd[i]; assign(fo,tfo); rewrite(fo); writeln(fo,sol); dem:=0; for i:=0 to N do if dd[i]=1 then begin write(fo,i,' '); inc(dem); if dem mod 10=0 then writeln(fo); end; close(fo); end; BEGIN Docdl; Tim; Inkq; END.

Cu b v N (N<=100) vng trn, nh s t 1 ti N v t mu cc vng trn (c th c cc vng trn c mu ging nhau). Sau ni tng cp li bng cc cung nh hng, mi cung c mt mu nht nh. Cc mu (ca cung v ca vng trn) c nh s t 1 n 100. Cu b chn 3 s nguyn khc nhau L, K v Q nm trong phm vi t 1 ti N, t vo trong cc vng trn s L v K mi vng mt hn bi, sau bt u di chuyn bi theo qui tc sau: - Bi ch c chuyn theo cung c mu trng vi mu ca vng trn cha vin bi th 2. - Bi ch c chuyn theo chiu cung. - Hai vin bi khng c ng thi cng mt vng trn. - Qu trnh di chuyn kt thc, khi mt trong hai vin bi ti vng trn Q. Hy lp trnh xc nh cch di chuyn chm dt qu trnh sau mt s t nht cc bc chuyn. D liu: vo t file BI.INP: - Dng u: 4 s nguyn N, L, K, Q - Dng th 2: N s nguyn C1, C2, , CN (Ci: l mu ca vng trn i). - Dng th 3: s nguyn M (0<=M<=10000). - M dng sau: mi dng 3 s nguyn Ai Bi Di xc nh cung mu Di i t vng trn Ai ti vng trn Bi. Cc s trn mt dng cch nhau 1 du cch. Kt qu: a ra file BI.OUT: - Dng u: YES hoc NO cho bit qu trnh c kt thc c hay khng. - Nu dng u l YES th dng 2 cha s nguyn xc nh s bc chuyn ti thiu. Hng dn: Trong bi ny ta xt mt k thut tm kim theo chiu rng (loang) pht trin thm l loang mng: trong qu trnh loang, ta thng hay dng mt hng i lu li ton b cc trng thi thm v chun b thm. Nhng ta ch loang l tm kim theo mc, t mt mc khi u s sinh ra mc tip theo v t mc tip theo s sinh ra mc tip theo na Khi , mc c dng sinh khng cn cn thit na ngha l ta hon ton c th loi b chng ra khi hng i ly "ch" cho cc trng thi sau. T tng trn, ta s dng 2 mng khc thay th cho 1 hng i lu li 2 mc lin tip nhau. bi tp ny, mt trng thi c ghi nhn l s th t ca 2 vng trn cha 2 vin bi v ta coi n l mt nt ca cy tm kim, k hiu (i,j). Gi nhn ca mt nt l f(i,j): f(i,j)=0 hoc f(i,j)=1 cho bit nt cha thm hay thm. Nh vy mt nt s c thm nu n tha mn mi iu kin ca bi ton v nhn ca n c gi tr 0. T , ta suy ra rng mt mc s c khng qu n2 nt. Do vy, ta s dng 2 mng q1, q2 kch thc n*n lu li cc nt ca 2 mc lin tip. Chng trnh: const inp=bi.inp; out=bi.out; var a,q1,q2,f:array[1..100,1..100] of byte; c:array[1..100] of byte; n,v1,v2,v3:byte; m,dem:integer; stop:boolean; fi:text; Procedure docf; var i,j,mau:byte; k:integer; begin assign(fi,inp); reset(fi); readln(fi,n,v1,v2,v3); for k:=1 to n do read(fi,c[k]); readln(fi); readln(fi,m); fillchar(a,sizeof(a),0); for k:=1 to m do begin readln(fi,i,j,mau); a[i,j]:=mau; end; close(fi); end; Procedure initBFS; begin fillchar(f,sizeof(f),0) {khi to tt c cc nt u cha thm} fillchar(q1,sizeof(q1),0){mc khi u cha c nt no} fillchar(q2,sizeof(q2),0) {mc tip theo cng cha c nt no} q1[v1,v2]:=1;q1[v2,v1]:=1; f[v1,v2]:=1;f[v2,v1]:=1; end; Procedure inkq; Begin writeln(fi,YES); writeln(fi,dem); close(fi); halt; end; Procedure play; var i,j,k:byte; begin for i:=1 to n do for j:=1 to n do if q1[i,j]=1 then for k:=1 to n do if (k<>j) and (a[i,k]=c[j]) and (f[k,j]=0) then begin q2[k,j]:=1;q2[j,k]:=1; f[k,j]:=1;f[j,k]:=1; stop:=false; if k=v3 then inkq; end; end; Procedure BFS; begin dem:=0; {bt u mc 0} repeat inc(dem); stop:=true; play; if stop=false then begin q1:=q2; {ghi mc mi ln mc c} fillchar(q2,sizeof(q2),0); {khi to mc mi cha c nt no}

until stop; Procedure xuly; begin assign(fi,out); writeln(fi,NO);

end;

end; Begin docf; xuly;

rewrite(fi); close(fi);

initBFS; BFS;

End.

Thut ton qui hoch ng Trong qu trnh hc tp, chng ta gp rt nhiu cc bi tp v Ton-Tin. Cc bi tp dng ny rt phong ph v a dng. Thc t cha c thut ton hon chnh c th p dng cho mi bi ton. Tuy nhin ngi ta tm ra mt s thut ton chung nh chia tr, tham n, quay lui,... Cc thut ton ny c th p dng gii mt lp kh rng cc bi ton hay gp trong thc t. Trong bi vit ny, ti mun cp vi cc bn mt thut ton khc, l thut ton quy hoch ng. T tng c bn ca thut ton l: gii mt bi ton ta chia bi ton thnh cc bi ton nh hn c th gii mt cch d dng. Sau kt hp li gii cc bi ton con, ta c c li gii bi ton ban u. Trong qu trnh gii cc bi ton con i khi ta gp rt nhiu kt qu trng lp ca cc bi ton con. tng tnh hiu qu, thay v phi tnh li cc kt qu , ta lu chng vo mt bng. Khi cn li gii ca mt bi ton con no ta ch cn tim trong bng, khng cn tnh li. T tng ca thut ton quy hoch ng kh n gin. Tuy nhin khi p dng thut ton vo trng hp c th li khng d dng (iu ny cng tng t nh nguyn tc Dirichlet trong ton vy). Khi gii bi ton bng phng php ny, chng ta phi thc hin hai yu cu quan trng sau: - Tm cng thc truy hi xc nh nghim bi ton qua nghim cc bi ton con nh hn. - Vi mi bi ton c th, ta ra phng n lu tr nghim mt cch hp l t c th truy cp mt cch thun tin nht. minh ho thut ton, ta xt mt vi v d. V d 1: Cho hai dy s nguyn (a1,a2,...,am), (b1,b2,...,bn). Tm dy con chung c di ln nht ca hai dy trn (coi dy khng c s nguyn no l dy con ca mi dy v c di bng 0). Li gii Chng ta c th thy ngay rng phc tp ca bi ton trn ph thuc vo hai s m, n. Xt hai trng hp: +Trng hp1:; m=0 hoc n=0. y l trng hp c bit, c duy nht mt dy con chung ca hai dy c di bng 0. V vy dy con chung c di ln nht ca chng c di bng 0. +Trng hp 2: m# 0 v n # 0. Trong trng hp ny, ta xt cc bi ton nh hn l tm dy con chung c di ln nht ca hai dy (a1,a2,...,ai), (b1,b2,...,bj) vi 0 <= i <= m, 0 <= j <= n. Gi [i,j] l di ca dy con chung ln nht ca hai dy (a1,...,ai), (b1,...,bj). ; Nh vy ta phi tnh tt c cc l[i,j] trong 0<=i<=m, 0<=j<=n. Chng ta c th thy ngay rng l[0,0]=0. Gi s ta tnh c l[s,t] vi 1 - Nu ii # bj th l[i,j]=max{l[i-1,j], l[i,j-1]}. - Nu ii=bj th l[i,j]= 1+l[i-1,j-1]. Vi nhng nhn xt trn, ta hon ton tnh c l[m,n] chnh l di dy con chung di nht ca (a1,..am), (b1,..bn). tm phn t ca dy con, ta xut pht t l[m,n] ti l[0,0]. Gi s ta ang l[i,j]. Nu ai=bj th ta thm ai vo dy con ri nhy ti l[i-1,j-1]. Nu aibj th l[i,j]=l[i-1,j] hoc l[i,j]=l[i,j-1]. Nu l[i,j]=l[i-1,j] th nhy ti l[i1,j], ngc li th nhy ti l[i,j-1]. Sau y l li gii ca bi ton. Chng trnh c vit bng ngn ng Pascal: uses crt; inc(i); const read(f,b[i]); fi='b2.inp'; end; var maxb:=i; a:array[1..10] of integer; close(f); b:array[1..10] of integer; end; kq:array[0..10,0..10] of integer; function max(a,b:integer):integer; i,j,maxa,maxb:integer; begin f:text; if a>b then max:=a procedure init; else max:=b; begin end; assign(f,fi); begin reset(f); init; i:=0; kq[0,0]:=0; while not(eoln(f)) do for i:=1 to maxa do begin for j:=1 to maxb do inc(i); if a[i]<>b[j] then kq[i,j]:=max(kq[i-1,j],kq[i,j-1]) read(f,a[i]); else kq[i,j]:=kq[i-1,j-1]+1; end; writeln('Do dai day con chung lon nhat:',kq[maxa,maxb]); maxa:=i; i:=maxa; readln(f); j:=maxb; i:=0; while (i>0)or(j>0) do while not(eoln(f)) do if a[i]=b[j] then begin begin

write(a[i]); else dec(i); if kq[i-1,j]=kq[i,j] then dec(i) dec(j); else dec(j); end end. Vi ni dung file b2.inp cha 2 dy (a1,a2,..am) ,(b1,b2,..bn) sau: 1232346 6987 Xt bi ton kinh in v ti u t hp: V d2: Cho ci ti cha c trng lng ti a l w. C n vt, vt th i c khi lng a[i] v gi tr c[i], 1<= i <=n. Tm cch xp vt vo ti sao cho t gi tr ln nht. Li gii Gi f(k,v) l gi tr ln nht ca ti ng trng lng v v ch cha cc vt t 1 n k. Nu k=1 th f(k,v)=(v div a[1])*c[1]. Gi s tnh c f(s,t) vi 1<S< ti?nh Ca^`n 1<t t: tg=v div a[k], f(k,v)=max{f(k-1,u)+x*c[k]} (*) ,vi x=0,1,2,...,tg, u=v-x*a[k] Gi tr ln nht l f(n,w). Ta dng mng bn ghi a[1..n,1..w] cha kt qu trung gian. Mi bn ghi a[k,v] cha gi tr f(k,v) v gi tr x tho mn cng thc (*). xc nh s lng x[i] vt i tho mn iu kin ti u, ta xut pht t a[n,w] xc nh c x[n]. Nhy ti a[n-1,w-x[n]*a[n]] xc nh c x[n-1]. C nh vy ti x[1]. uses crt; begin const tg:=j div a[i]; n=5; max:=0; w=17; for k:=0 to tg do fi='b3.inp'; if (b[i-1,j-k*a[i]].val+k*c[i])>max then type begin kq=record max:=b[i-1,j-k*a[i]].val+k*c[i]; num,val:integer; save:=k; end; end; var a:array[1..10] of integer; {khoi luong} b[i,j].val:=max; c:array[1..10] of integer; {Gia tri} b[i,j].num:=save; i,j,tg,k,max,save:integer; end; f:text; for i:=1 to n do b:array[1..n,1..w] of kq; begin procedure init; for j:=1 to w do write(b[i,j].val:3); begin writeln; assign(f,fi); end; reset(f); writeln('Max:',b[n,w].val); for i:=1 to n do i:=n; begin j:=w; read(f,a[i],c[i]); while i>=1 do end; begin close(f); if b[i,j].num>0 then writeln('Co ',b[i,j].num,' do vat ',i); end; j:=j-a[i]*b[i,j].num; begin dec(i); init; end; for j:=1 to w do readln; for i:=1 to n do end. Vi ni dung file b3.inp :hng i cha khi lng a[i], gi tr c[i]: 34 45 7 10 8 11 9 13 Qua hai v d trn chc cc bn nm c t tng ca thut ton qui hoch ng cng nh cch ci t cho n. Nh cc bn thy, cch pht biu thut ton rt n gin. Nu bit cch vn dng thut ton mt cch hp l, ta c th gii c mt lp kh rng cc bi ton trong thc t. Hi vng thut ton s l cng c tt ca cc bn trong qu trnh hc tp mn tin hc. Tp tin nh kiu Tp tin nh kiu l tp tin m cc phn t (mu tin) ca n c cng di. Kiu tp tin c th l kiu c s nh k t, nguyn, thc,... hoc kiu c cu trc nh mng, bn ghi,... a. Cch khai bo + Khai bo gin tip TYPE <Kiu File> = FILE OF <Kiu phn t> ;

VAR <Bin File> : <Kiu File> ; V d TYPE {nh ngha cc kiu tp tin} FileNguyen = FILE OF integer ; FileReal = FILE OF real ; FileKyTu = FILE OF char ; NhanSu = RECORD HoTen : string[25] ; Tuoi : Byte ; Dchi : string[35] ; Luong : real ; END ; FileNhanSu = FILE OF NhanSu ; VAR FN : FileNguyen ; FR : FileReal ; FC : FileKyTu ; FP : FileNhanSu ; + Khai bo trc tip VAR <Bin File> : FILE OF <Kiu phn t> ; V d TYPE NhanSu = RECORD HoTen : string[25] ; Tuoi : Byte ; Dchi : string[35] ; Luong : real ; END ; VAR FN : FILE OF integer ; FR : FILE OF real ; FC : FILE OF char; FP : FILE OF NhanSu ; Trong cc v d trn, ta c: - Bin tp tin FN l mt tp tin kiu nguyn vi mi phn t ca chng l mt s nguyn v c di l 2 bytes. - Bin tp tin FR l mt tp tin kiu thc vi mi phn t ca chng l mt s thc v c di l 6 bytes. - Bin tp tin FC l mt tp tin kiu k t vi mi phn t ca chng l mt k t v c di l 1 byte. - Bin tp tin FP l mt tp tin kiu bn ghi vi mi phn t ca chng l mt bn ghi v c di l 67 bytes. * Th tc ASSIGN(FileVar, FileName) Lnh ny dng gn tn tp tin FileName cho 1 bin file l FileVar. Filename l tn ca mt tp tin, do vy FileName cn tun theo cch t tn ca MS-DOS. V d 8.48: VAR Fnguyen : FILE OF integer ; BEGIN ASSIGN(Fnguyen, SONGUYEN.DAT ) ; { Gn tp tin c tn l SONGUYEN cho bin Fnguyen } REWRITE(FileVar) {Cu lnh s gii thch phn k} ................ * Th tc REWRITE (FileVar) Lnh ny m mt tp tin mi trn a t c tn l FileName ( khai bo trong th tc ASSIGN). Nu FileName c sn trong a th ni dung ca n b xa v con tr t u tp tin. Trong c 2 trng hp, sau lnh ny trong tp tin u rng v thng tin mi s c a vo nh th tc WRITE s trnh by phn sau. * Th tc RESET(FileVar) M tp tin c sn trong a t c tn l FileName khai bo trong lnh ASSIGN, con tr tp tin t u tp tin, dng lnh READ c thng tin (s cp phn sau). * Th tc WRITE(FileVar, x1, x2, ..., xn) Lnh ny ghi ln lt cc bin x1, x2, ..., xn, l cc bin thuc kiu phn t ca bin File, vo tp tin c tn l FileName (trong lnh ASSIGN) vo a t theo v tr tun t ca con tr ang ng. * Th tc READ(FileVar, x1, x2, ..., xn) Lnh ny c tun t cc gi tr x1, x2, ..., xn ti v tr con tr ang ng ri gn vo cc bin tng ng cng kiu. Ch : Sau khi c hoc ghi mt phn t, th con tr tp tin s di chuyn xung v tr phn t tip theo. V d 8.49:

Program Write_Read; Var Tepnguyen: File Of integer; i: integer; Begin Assign(tepnguyen,U:\SONGUYEN.DAT ); Rewrite(Tepnguyen); For i :=1 to 4 do write(tepnguyen,i); begin Read(tepnguyen,i); write(i= ,i:4); end; Close(Tepnguyen); Readln(tepnguyen); End. * Th tc SEEK(FileVar, n) Lnh ny ch th con tr tp tin chuyn n v tr phn t th n ca tp tin. Trong , n l s nguyn ch v tr cc phn t trong tp tin, phn t th nht c s th t l 0. * Hm EOF(FileVar):Boolean Hm EOF (End-Of-File) ny dng kim tra tnh trng ht tp tin. Nu con tr cui file th n s cho kt qu l TRUE, ngc li con tr bt k ni khc khng phi cui tp tin l FALSE. Mi l mt phn t ca tp tin. Nu con tr nm v tr cui, EOF s l TRUE. * Th tc CLOSE(FileVar) ng tp tin li v cp nht th mc phn nh tnh trng mi ca tp tin. 3. Tp tin vn bn TOP a. Khi nim Trong Pascal c mt kiu tp tin khc, l tp tin vn bn, c tn gi l text file. y l tp tin kiu k t, tuy nhin, tp tin text c cu trc thnh cc dng, mi dng c kt thc bi du ht dng eoln (endof-line). i vi Turbo Pascal, du eoln c to bi 2 k t iu khin l CR (carriage return - v u dng) v LF (line feed - nhy xung dng tip). CR l chr(13) v LF l chr(10). Text file c kt thc bi du end-of-file, vi Turbo Pascal du end-of-file l Ctrl-Z c m ASCII l k t s 26. V chiu di ca cc dng l khc nhau nn tp tin vn bn ch c th truy xut theo kiu tun t. Ngoi ra, khng th tin hnh c 2 hot ng c v ghi cng lc trn text file. s dng text file, ta phi thc hin cc th tc ASSIGN, sau m tp tin bng cc th tc RESET, REWRITE hoc APPEND. - REWRITE dng to ra mt text file mi, sau ta ch c th tin hnh ghi ln text file mt cch tun t. - RESET m mt tp tin c v sau ta ch c th c mt cch tun t. * Ghi d liu vo tp tin vn bn C 3 mu ghi d liu vo text file l: WRITE(FileVar, Item1, Item2, ..., ItemN) ; Ghi gi tr cc phn t Item1, Item2,..., ItemN ln tp tin c i din bi FileVar. WRITELN(FileVar, Item1, Item2, ..., ItemN) ; Ging nh th tc WRITE, nhng sau s ghi thm du kt thc dng (cc k t iu khin: CR v LF) WRITELN(FileVAR) ; Ch lm mt vic l ghi ln tp tin du kt thc dng. FileVar l mt bin kiu text. Item1, Item2, ..., ItemN l cc mc ghi cc hng, bin, biu thc ca cc kiu v hng chun, kiu min con v kiu chui. Cc th tc ghi vo text file khng chp nhn cc kiu ghi d liu kiu mng (ARRAY), kiu tp hp (SET), kiu bn ghi (RECORD) v kiu tp tin (FILE). V d Program TepVanban; Var f: TEXT; Begin Assign(f,U:\Vanban.DAT); Rewrite(f); (1) Writeln(f,1,2,3); (2) write(f,4,5); (3) writeln(f); (4) Close(f); End. Chng trnh s to ra tp U:\Vanban.Dat c dng nh sau: * c d liu t tp tin vn bn: Vic c d liu t tp vn bn c thc hin hon ton tng t nh vic c d liu t bn phm, ta c 3 mu c d liu t text file l: - READ(FileVar, Variable1, Variable2, ..., VariableN) ; - READLN(FileVar, Variable1, Variable2, ..., VariableN) ; - READLN(FileVAR) ; FileVar l mt bin kiu text.

Variable1, Variable2, ..., VariableN l cc bin thuc cc kiu v hng chun, kiu min con v kiu chui. Th tc Readln(FileVar, Variable1, Variable2, ..., VariableN) ; s a con tr xung hng tip sau khi c ht cc bin tng ng. Th tc Readln(FileVar) ; xung dng tip theo m khng c g ht. Cc th tc c d liu t text file khng chp nhn cc d liu kiu mng (ARRAY), kiu tp hp (SET), kiu bn ghi (RECORD) v kiu tp tin (FILE). V d Chng trnh m s dng ca mt tp vn bn: Program Dem_dong; Var f:TEXT; sodong:integer; Begin sodong:=0; {$I-} Assign(f,U:\VanBan.DAT); Reset(f); {$I+} if IOResult<>0 then begin Writeln(' Tp ny khng tn ti '); halt(1); end esle begin While Not EOF(f) Do begin INC(sodong); readln(f); {Xung dng k tip} end; Close(f); Writeln(' S dng m c l :' ,sodong); Readln; End. * Hm EOLN(FileVar) Hm EOLN(f) c gi tr l true nu nh con tr ca text file f ang vo k t iu khin CR ca du end-of-line hoc khi end-of-file c gi tr l true. inc(i) l dng tng bin thm 1 n v inc(i,n) {n l s bn chn} l tng bin ln n n v *

Di qua bn tri k bit: SHL

You might also like