31
MOÄT SOÁ THUAÄT TOAÙN VEÀ MAÛNG 2 CHIEÀU Caáu truùc döõ lieäu Maûng – ñaëc bieät laø maûng 2 chieàu – laø moät trong nhöõng kieåu döõ lieäu raát quan troïng, noù coù trong moïi loaïi ngoân ngöõ laäp trình, vôùi öu ñieåm deã taïo, deã truy xuaát ñeán töøng phaàn töû, coù nhieàu baøi toaùn baét buoäc phaûi xöû lyù treân maûng 2 chieàu, do ñoù nghieân cöùu caùc thuaät toaùn treân maûng 2 chieàu laø coâng vieäc caàn thieát cuûa baát cöù laäp trình vieân ngoân ngöõ naøo. Sau ñaây xin giôùi thieäu moät vaøi thuaät toaùn cô baûn veà maûng 2 chieàu. Ta haõy ñi töø nhöõng thuaät toaùn ñôn giaûn nhaát: 1. Tìm phaàn töû lôùn nhaát, nhoû nhaát cuûa maûng 2 chieàu : “ 1 maûng 2 chieàu, haõy tìm phaân töû lôùn nhaát, nhoû nhaát” Khoâng coù gì caàn phaûi noùi nhieàu veà coâng vieäc quaù ñôn giaûn naøy, ta cöù cho A[1,1] laø MAX vaø laø MIN roài duøng 2 voøng laëp FOR duyeät taát caû nhöõng phaàn töû cuûa maûng ñeå tìm phaàn töû lôùn hôn MAX vaø nhoû hôn MIN , neáu tìm ñöôïc thì gaùn laïi trò môùi cho MAX vaø cho MIN. Program Tim_phan_tu_lon_nhat_nho_nhat_cua_mang_2_chieu; USES CRT; Const DIM=10; TYPE Mang2=Array[1..dim,1..dim] of Integer; VAR m,n,i,j:Integer; A:Mang2; dong,cot:Integer;

TL BDHSG Mang 2 Chieu

Embed Size (px)

DESCRIPTION

pascal

Citation preview

Page 1: TL BDHSG Mang 2 Chieu

MOÄT SOÁ THUAÄT TOAÙN VEÀ MAÛNG 2 CHIEÀU

Caáu truùc döõ lieäu Maûng – ñaëc bieät laø maûng 2 chieàu – laø moät trong nhöõng kieåu döõ lieäu raát quan troïng, noù coù trong moïi loaïi ngoân ngöõ laäp trình, vôùi öu ñieåm deã taïo, deã truy xuaát ñeán töøng phaàn töû, coù nhieàu baøi toaùn baét buoäc phaûi xöû lyù treân maûng 2 chieàu, do ñoù nghieân cöùu caùc thuaät toaùn treân maûng 2 chieàu laø coâng vieäc caàn thieát cuûa baát cöù laäp trình vieân ngoân ngöõ naøo.

Sau ñaây xin giôùi thieäu moät vaøi thuaät toaùn cô baûn veà maûng 2 chieàu.

Ta haõy ñi töø nhöõng thuaät toaùn ñôn giaûn nhaát:

1. Tìm phaàn töû lôùn nhaát, nhoû nhaát cuûa maûng 2 chieàu :

“ 1 maûng 2 chieàu, haõy tìm phaân töû lôùn nhaát, nhoû nhaát”

Khoâng coù gì caàn phaûi noùi nhieàu veà coâng vieäc quaù ñôn giaûn naøy, ta cöù cho A[1,1] laø MAX vaø laø MIN roài duøng 2 voøng laëp FOR duyeät taát caû nhöõng phaàn töû cuûa maûng ñeå tìm phaàn töû lôùn hôn MAX vaø nhoû hôn MIN , neáu tìm ñöôïc thì gaùn laïi trò môùi cho MAX vaø cho MIN.

Program Tim_phan_tu_lon_nhat_nho_nhat_cua_mang_2_chieu;USES CRT;Const DIM=10;TYPE Mang2=Array[1..dim,1..dim] of Integer;VAR m,n,i,j:Integer; A:Mang2; dong,cot:Integer;{*****************************}Function Tim_Min(Var A:Mang2;m,n:Integer):Integer;VAR i,j,temp:Integer;Begin Temp:=A[1,1]; For i:=1 To M Do For j:=1 To n Do

Page 2: TL BDHSG Mang 2 Chieu

If A[i,j]<Temp Then begin Temp:=A[i,j]; dong:=i; cot:=j; End;Tim_Min:=Temp;End;{*****************************}Function Tim_Max(Var A:Mang2;m,n:Integer):Integer;VAR i,j,temp:Integer;Begin Temp:=A[1,1]; For i:=1 To M Do For j:=1 To n Do If A[i,j]>Temp Then begin Temp:=A[i,j]; dong:=i; cot:=j; End;Tim_Max:=Temp;End;{*****************************}BEGINClrScr;Randomize;Write('So dong: ');Readln(m);Write('So cot: ');Readln(n); For i:=1 To M Do For j:=1 To n Do A[i,j]:=(Random(100)-Random(100)); For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln; End;Writeln;Writeln('PHAN TU NHO NHAT:= ',TIM_MIN(A,m,n));Writeln('Tai vi tri Dong ',dong:2,' , cot ',cot:2);Writeln;Writeln('PHAN TU LON NHAT:= ',TIM_MAX(A,m,n));Writeln('Tai vi tri Dong ',dong:2,' , cot ',cot:2);READLN;

Page 3: TL BDHSG Mang 2 Chieu

END.Baïn haõy giaûi laïi baøi toaùn treân vaø cho bieát vò trí tìm ñöôïc cuûa caùc phaàn töû Max vaø Min

2. Tìm Max, min cuûa moãi doøng vaø moãi coät :Coâng vieäc coù veû phöùc taïp hôn moät chuùt, vôùi

maûng ñaõ cho :TYPE ARRAY2 = ARRAY[1..Dim,1..Dim] of Integer;VAR MANG:Array2;Taïi moãi doøng, ta phaûi tìm phaàn töû lôùn nhaát, nhoû

nhaát vaø cuõng nhö vaäy vôùi moãi coät.Ñeå giaûi quyeát vaán ñeà, ta phaûi khai baùo theâm 4

maûng 1 chieàu ñeå löu tröõ phaàn töû MAX[coät i], MAX[doøng i], Min[coät i], MIN[doøng i], nhöng vì coâng vieäc tìm treân doøng vaø treân coät laø ñoäc laäp nhau neân ta coù theå chæ caàn duøng 2 maûng 1 chieàu thoâi MAX vaø MIN chaúng haïn ñeå tieát kieäm boä nhôù, nhöng ñeå tieát kieäm boä nhôù nhaát, ta chæ caàn 1 maûng 1 chieàu ñeå löu giöõ lieäu maø thoâi.

Vôùi khai baùo :MA: Array[1..Dim*Dim] of Integer

Ñaàu tieân ta gaùn MANG[1,i] laø Max (sau ñoù laø Min) roài duyeät taát caû nhöõng phaàn töû cuûa doøng i ñeå tìm Max (vaø Min) cuûa doøng aáy, döõ lieäu tìm ñöôïc seõ gaùn cho trò MA[i].

Töông töï ta gaùn Max hay Min laø trò cuûa MANG[1,i] roài duyeät taát caû nhöõng phaàn töû cuûa coät [i] ñeå tìm.

Toaøn vaên chöông trình nhö sau:Program Tim_Max_va_Min_cua_dong_cot;USES Crt;Const DIM=10;TYPE ARRAY2 = ARRAY[1..Dim,1..Dim] of Integer; ARRAY1 = ARRAY[1..Dim] of Integer;VAR MANG:Array2; MA:Array1; i,j,m,n,t:Integer;{--------------------------------}Procedure PHATSINH(VAR A:ARRAY2;m,n:Integer);

Page 4: TL BDHSG Mang 2 Chieu

Begin For i:=1 To m Do Begin For j:=1 To n Do A[i,j]:=Random(100)-Random(100);End;End;{--------------------------------}Procedure HIENTHI(VAR A:ARRAY2;m,n:Integer);BeginFor i:=1 To m Do Begin For j:=1 To n Do Write(A[i,j]:4); Writeln;End;End;{--------------------------------}PROCEDURE Dong;BeginWriteln; For i:=1 To m Do Begin Ma[i]:=MANG[i,j]; For j:=1 To n Do Begin If MANG[i,j]>Ma[i] Then Ma[i]:=MANG[i,j]; End; Writeln('Max dong ',i,' la: ',Ma[i]); End; Writeln; For i:=1 To m Do Begin Ma[i]:=MANG[i,j]; For j:=1 To n Do Begin If MANG[i,j]<Ma[i] Then Ma[i]:=MANG[i,j]; End; Writeln(' Min dong ',i,' la: ',Ma[i]); End;End;{--------------------------------}PROCEDURE COT;BeginWriteln; For i:=1 To n Do Begin Ma[i]:=MANG[i,j];

Page 5: TL BDHSG Mang 2 Chieu

For j:=1 To m Do Begin If MANG[j,i]>Ma[i] Then Ma[i]:=MANG[j,i]; End; Writeln('Max cot ',i,' la: ',Ma[i]); End;

Writeln; For i:=1 To n Do Begin Ma[i]:=MANG[j,i]; For j:=1 To m Do Begin If MANG[j,i]<Ma[i] Then Ma[i]:=MANG[j,i]; End; Writeln(' Min cot ',i,' la: ',Ma[i]); End;End;{--------------------------------}BEGINRandomize;ClrScr;Write('So dong, m= '); Readln(m);Write('So cot, n= '); Readln(n);PHATSINH(MANG,m,n);Clrscr;Writeln('Mang 2 chieu da cho:');HIENTHI(MANG,m,n);DONG;Readln;ClrScr;Writeln('Mang 2 chieu da cho:');HIENTHI(MANG,m,n);COT;Readln;END.

3. Bieán maûng 2 chieàu thaønh maûng 1 chieàu :Ta phaûi bieán maûng 2 chieàu m doøng, n coät thaønh 1

maûng 1 chieàu coù soá phaàn töû laø m*n baèng caùch ñieàn laàn löôït caùc giaù trò cuûa maûng 2 chieàu töø traùi qua phaûi, töø treân xuoáng döôùi vaøo caùc phaàn töû cuûa 1 maûng 1 chieàu.

Page 6: TL BDHSG Mang 2 Chieu

Vaán ñeà seõ töôûng chöøng khoù khaên vì 1 ñaèng, bieán t cuûa maûng 1 chieàu phaûi taêng lieân tuïc töø 1 ñeán m*n trong khi doøng i, coät j seõ cöù phaûi thay ñoåi giaù trò sau khi heát 1 doøng,

Thí duï :Maûng 2 chieàu :

a b c d ef g h i jk l . . . . . . . . .

Taïi moãi doøng, bieán ñeám i seõ chaïy töø 1 ñeám mTrong khi ñoù ta caàn bieán noù thaønh maûng 1 chieàu:

a b c d e f g h i j . . . . . . . . Bieán ñeám t laïi chaïy töø 1 ñeán

mxn

Nhöng thaät ra, khoâng coù gì phöùc taïp laém ñeå coù theå hieåu ñöôïc thuaät toaùn nhö sau:

. . . . . . . . . . . . . . . . . . . . .t:=1; For i:=1 To m Do Begin For j:=1 To n Do Begin

If t<=m*n Then B[t]:=A[i,j]; t:=t+1; End; End;

Tìm ñöôïc thuaät toaùn cho coâng vieäc naøy laø raát caàn thieát cho vieäc giaûi quyeát nhöõng baøi toaùn phöùc taïp hôn sau ñoù.

. . . . . . . . . . . . . . . . . . . . .Baïn haõy coá gaéng laøm thöû, coøn neáu coù gì khoù

khaên thì ñaønh phaûi nghieân cöùu toaøn vaên chöông trình sau:

Program Mang_2_thanh_Mang_1;USES Crt;Const DIM=10;TYPE ARRAY2 = ARRAY[1..Dim,1..Dim] of Integer; ARRAY1 = ARRAY[1..Dim*Dim] of Integer;VAR

Page 7: TL BDHSG Mang 2 Chieu

M1: Array1; M2:Array2; i,j,m,n,t:Integer;{--------------------------------}Procedure PHATSINH(VAR A:ARRAY2;m,n:Integer);Begin For i:=1 To m Do Begin For j:=1 To n Do M2[i,j]:=Random(100);End;End;{--------------------------------}Procedure HIENTHI2(VAR A:ARRAY2;m,n:Integer);BeginFor i:=1 To m Do Begin For j:=1 To n Do Write(M2[i,j]:4); Writeln;End;End;{--------------------------------}Procedure BIENDOI(VAR A:ARRAY2;VAR B:ARRAY1;m,n,t:Integer);Begint:=1; For i:=1 To m Do Begin For j:=1 To n Do Begin If t<=m*n Then B[t]:=A[i,j]; t:=t+1; End; End;End;{--------------------------------}Procedure HIENTHI1(VAR A:ARRAY1;t:Integer);BeginFor t:=1 To m*n Do Write(A[t]:4); Writeln;End;{--------------------------------}BEGINRandomize;ClrScr;Write('So dong, m= '); Readln(m);

Page 8: TL BDHSG Mang 2 Chieu

Write('So cot, n= '); Readln(n);PHATSINH(M2,m,n);Writeln('Mang 2 chieu da cho:');HIENTHI2(M2,m,n);BIENDOI(M2,M1,m,n,t);Writeln('Bien thanh Mang 1 chieu:');HIENTHI1(M1,t);Readln;END.Baïn haõy töï nghieân cöùu baøi toaùn ngöôïc laïi: Cho 1

maûng 1 chieàu goàm t phaàn töû, giaû söû ta tìm ñöôïc 2 soá m,n sao cho t=m*n, haõy bieán maûng ñaõ cho thaønh maûng 2 chieàu coù m doøng vaø n coät hoaëc n doøng, m coät theo ñuùng thöù töï töø traùi qua phaûi vaø töø treân xuoáng döôùi.

. . . . . . . . 4. Baøi toaùn “bung” maûng 2 chieàu:Vaán ñeà cuûa baøi toaùn naøy laø :“Cho 1 maûng 2 chieàu m*n phaàn töû, haõy “bung” maûng

naøy ra 4 phía ñeå taïo thaønh 1 maûng 2 chieàu môùi coù m+2*n+2 phaàn töû”

Tröôùc khi bung:A B C DD E F GH I J KL M N O

Sau khi bung :* * * * * ** A B C D ** D E F G ** H I J K ** L M N O ** * * * * *

Cöù cho raèng ta coù quyeàn ñieàn soá baát kyø naøo vaøo caùc phaàn töû ñöôïc “bung”, coøn neáu ñaõ giaûi ñöôïc thì roõ raøng ta coù theå dieàu caùc phaàn töû ñöôïc “bung” aáy vôùi caùc soá thoûa maõn ñieàu kieän naøo ñoù.

Tröôùc heát neáu maûng ñaõ cho coù m doøng (töø doøng 1 ñeán doøng m) thì maûng môùi seõ coù m+2 doøng (töø doøng 0 ñeán doøng m+1) , töông töï vôùi n coät cuûa maûng ñaõ cho (töø coät 1 ñeán coät n) thì maûng môùi cuõng phaûi coù n+2 coät töø coät 0 ñeán coät n+1.

Page 9: TL BDHSG Mang 2 Chieu

Thuaät toaùn “bung ra” ñöôïc dieãn taû nhö sau:

For i:=0 To n+1 Do Begin A[0,i] := Random(100); A[m+1,i] := Random(100); End; For i:=1 To m Do Begin A[i,0] := Random(100); A[i,n+1] := Random(100); End;

Vôùi thuaät toaùn treân, ta coù chöông trình nhö sau:

Program Mo_rong_mang_2_chieu;USES CRT;Const DIM=10;TYPE Mang2=Array[0..DIM+1,0..DIM+1] of Integer;VAR m,n,i,j,Res:Integer; A:Mang2;{*****************************}PROCEDURE PHATSINH(var A:Mang2;m,n:Integer);Begin For i:=1 To M Do For j:=1 To n Do A[i,j]:=(Random(100)-Random(100));End;{*****************************}PROCEDURE HIENTHI(var A:Mang2;m,n:Integer);Begin For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln; End;End;{*****************************}BEGINClrScr;Randomize;Write('So dong: ');Readln(m);

Page 10: TL BDHSG Mang 2 Chieu

Write('So cot: ');Readln(n);PHATSINH(A,m,n);HIENTHI(A,m,n);{Mo rong ma tran} For i:=0 To n+1 Do Begin A[0,i] := Random(100); A[m+1,i] := Random(100); End; For i:=1 To m Do Begin A[i,0] := Random(100); A[i,n+1] := Random(100); End;Writeln; For i:=0 To M+1 Do begin For j:=0 To n+1 Do Write(A[i,j]:6); Writeln; End;READLN;END.Caùc baïn haõy töï vieát 1 chöông trình “bung” ma traän

nhö treân vaø ñieàn vaøo caùc vò trí môùi caùc phaàn töû theo thöù töï töø traùi sang phaûi, töø treân xuoáng döôùi laø 1,2,3 . . . . .

5. Tìm “Ñieåm cöïc tieåu” cuûa maûng 2 chieàu:Moät phaàn töû ñöôïc goïi laø ñieåm cöïc tieåu cuûa maûng

2 chieàu A[m,n] neáu noù khoâng lôùn hôn caùc phaàn töû keà noù.

Nhaän xeùt : Tröôùc heát, phaàn töû ñöôïc goïi laø keà 1 phaàn töû

neáu chuùng ôû caïnh nhau trong maûng (treân, döôùi, traùi, phaûi, treân traùi, treân phaûi, döôùi traùi, döôùi phaûi).

Soá phaàn töû keà vôùi 1 phaàn töû baát kyø cuûa maûng 2 chieàu phuï thuoäc vaøo vò trí cuûa noù trong maûng+ Moãi phaàn töû khoâng naèm treân caùc caïnh maûng

2 chieàu coù 8 phaân töû keà (F,G,J,K).+ Phaàn töû naèm taïi 4 goùc (A,D,M,Q) thì chæ coù 3

phaàn töû keà.+ Phaàn töû naèm treân bieân maø khoâng taïi goùc

(B,C,E,I,H,L,O,P thì coù 5 phaàn töû keà.

Page 11: TL BDHSG Mang 2 Chieu

A B C D EF G H I JK L M N OP Q R S T

YÙ töôûng 1:Ta qui baøi toaùn veà tìm phaàn töû nhoû nhaát trong caùc ma traän 3x3 taïo bôùi A[i,j] vaø caùc phaàn töû keà cuûa noù (baøi toaùn 1), roài so saùnh noù vôùi A[i,j]. Phöông phaùp naøy ñôn giaûn nhaát nhöng thôøi gian thöïc hieän seõ raát laâu.

YÙ töôûng 2 :Vôùi moãi phaàn töû A[i,j], ta xeùt caùc phaàn töû keà cuûa noù, neáu coù 1 phaàn töû naøo keà cuûa A[i,j] maø nhoû hôn A[i,j] thì A[i,j] khoâng phaûi laø ñieåm cöïc tieåu, khi tieán haønh baèng phöông phaùp naøy, ta phaûi löu yù xeùt A[i,j] trong 3 tröôøng hôïp (taïi goùc, taïi bieân vaø khoâng naèm treân caùc caïnh), chính vieäc phaûi phaân ra nhieàu tröôøng hôïp nhö vaäy seõ laøm cho baøi toaùn trôû neân daøi doøng, phöùc taïp.

YÙ töôûng 3:AÙp duïng thuaät toaùn cuûa yù töôûng 2, nhöng

keøm theo 1 thuaät toaùn nhoû laø “bung” ma traän veà 4 phía (baøi toaùn 4) vaø gaùn giaù trò cho caùc phaàn töû döôïc “bung” laø giaù trò lôùn nhaát trong mieàn giaù trò coù theå coù cuûa caùc phaàn töû trong maûng (Do khai baùo Array of Integer neân ta cho chuùng laø MaxInt) ñeå ñöôïc maûng sau:

* * * * * * ** A B C D E ** F G H I J ** K L M N O ** P Q R S T ** * * * * * *

(Giaù trò cuûa caùc phaàn töû * laø MaxInt)

Cuoái cuøng laø aùp duïng thuaät toaùn cuûa yù töôûng 2 cho maûng môùi naøy maø khoâng caàn phaân bieät caùc tröôøng hôïp. Caùc baïn haõy theo doõi kyõ Function Tim_cuc_tieu trong chöông trình ñeà nghò nhö sau:

Page 12: TL BDHSG Mang 2 Chieu

{*****************************}Program Tim_Cac_diem_cuc_tieu;USES CRT;Const DIM=10;TYPE Mang2=Array[0..DIM+1,0..DIM+1] of Integer;

VAR m,n,i,j,Res:Integer; A:Mang2;{*****************************}Function Tim_cuc_tieu(i,j:Integer):Boolean;VAR K,L:Integer; B:Boolean;Begin B:=TRUE; K:=i-1; WHILE B And (K<=i+1) Do Begin L:=j-1; WHILE B And (L<=j+1) Do Begin If A[K,L]<A[i,j] Then B:=FALSE; Inc(L); End; Inc(K); End; Tim_cuc_tieu:=B;End;{*****************************}PROCEDURE PHATSINH(var A:Mang2;m,n:Integer);Begin For i:=1 To M Do For j:=1 To n Do A[i,j]:=(Random(100)-Random(100));End;{*****************************}PROCEDURE HIENTHI(var A:Mang2;m,n:Integer);Begin For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4);

Page 13: TL BDHSG Mang 2 Chieu

Writeln; End;End;{*****************************}BEGINClrScr;Randomize;Write('So dong: ');Readln(m);Write('So cot: ');Readln(n);PHATSINH(A,m,n);HIENTHI(A,m,n);{Mo rong ma tran} For i:=0 To n+1 Do Begin A[0,i] := MaxInt; A[m+1,i] := MaxInt; End; For i:=1 To m Do Begin A[i,0] := MaxInt; A[i,n+1] := MaxInt; End; For i:=0 To M+1 Do begin For j:=0 To n+1 Do Write(A[i,j]:6); Writeln; End;For i:=1 To m Do For j:=1 To n Do If Tim_cuc_tieu(i,j) Then Writeln('A[',i,',',j,'] la cuc tieu');READLN;END.6. Tìm “phaàn töû yeân ngöïa” cuûa maûng 2 chieàu:Phaàn töû A[i,j] ñöôïc goïi laø “yeân ngöïa” cuûa maûng 2

chieàu neáu noù ñoàng thôøi laø phaàn töû nhoû nhaát caû doøng i vaø laø phaàn töû lôùn nhaát cuûa coät j, hoaëc A[i,j] phaûi laø phaàn töû lôùn nhaát cuûa doøng i vaø laø phaàn töû nhoû nhaát cuûa coät j.

Caùch deã nhaát laø ta khai baùo 4 maûng 1 chieàu ñeå löu tröõ MinDong{i], MaxDong{i], MinCot[j], MaxCot{j] roài sau ñoù tìm Yeân baèng thuaät toaùn ñôn giaûn sau.

For i:=1 To M Do For j:=1 To N Do Begin If (MinDong[i]=MaxCot[j]) Or

Page 14: TL BDHSG Mang 2 Chieu

(MaxDong[i]=MinCot[j]) Then Begin Writeln('Yen ',A[i,j]); End; End;Nhö baøi giaûi sau ñaây:Program Tim_cac_phan_tu_yen_ngua_cua_mang_2_chieu;USES CRT;Const DIM=10;TYPE Mang2=Array[1..dim,1..dim] of Integer;VAR

m,n,i,j,Max,Min:Integer; A:Mang2; MinCot,MaxCot,MinDong,MaxDong: Array[1..Dim] of Integer;{*****************************}Procedure PHATSINH(VAR A:Mang2;m,n:Integer);Begin For i:=1 To M Do For j:=1 To n Do A[i,j]:=(Random(100)-Random(100));End;{*****************************}Procedure HIENTHI(VAR A:Mang2;m,n:Integer);BeginFor i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln; End;End;{*****************************}BEGINClrScr;Randomize;Write('So dong: ');Readln(m);Write('So cot: ');Readln(n);PHATSINH(A,m,n);HIENTHI(A,m,n);

{xac dinh Min cot}

Page 15: TL BDHSG Mang 2 Chieu

For i:=1 To M Do Begin MinCot[i]:=A[1,i]; For j:=2 To N Do If A[j,i]<MinCot[i] Then MinCot[i]:=A[j,i]; End;For i:=1 To n DoWriteln('Min cot ',i,' la ',MinCot[i]);

{xac dinh Max cot} For i:=1 To M Do Begin MaxCot[i]:=A[1,i]; For j:=2 To N Do If A[j,i]>MaxCot[i] Then MaxCot[i]:=A[j,i]; End;For i:=1 To n DoWriteln(' Max cot ',i,' la ',MaxCot[i]);

{xac dinh Min dong} For i:=1 To N Do Begin MinDong[i]:=A[i,1]; For j:=2 To N Do If A[i,j]<MinDong[i] Then MinDong[i]:=A[i,j]; End;For i:=1 To n DoWriteln('Min dong ',i,' la ',MinDong[i]);

{xac dinh Min dong} For i:=1 To N Do Begin MaxDong[i]:=A[i,1]; For j:=2 To N Do If A[i,j]>MaxDong[i] Then MaxDong[i]:=A[i,j]; End;For i:=1 To n DoWriteln(' Max dong ',i,' la ',MaxDong[i]);

{Bat dau xac dinh}For i:=1 To M Do For j:=1 To N Do Begin If (MinDong[i]=MaxCot[j]) Or (MaxDong[i]=MinCot[j]) Then Begin Writeln('Yen ',A[i,j]); End; End;

Page 16: TL BDHSG Mang 2 Chieu

READLN;END.Baïn haõy töï nghieân cöùu caùch giaûi baøi toaùn treân

nhöng vôùi lôøi khai baùo ít maûng 1 chieàu hôn (xem laïi baøi toaùn soá 5)

{*****************************}

7. Saép xeáp maûng 2 chieàu :Trong maûng 1 chieàu, vieäc saép xeáp thôøng theo yeâu

caàu taêng hoaëc giaûm daàn töø traùi sang phaûi, trong maûng 2 chieàu, khaùi nieäm saép xeáp phaûi ñöôïc hieåu theo nghóa roäng hôn, saép xeáp nghóa laø ñaët caùc phaàn töû vaøo 1 maûng tuaân theo 1 qui luaät naøo ñoù.

Phöông phaùp ñôn giaûn vaø thöôøng ñöôïc duøng nhaát laø taïo ra 1 maûng 1 chieàu töø nhöõng phaàn töû cuûa maûng 2 chieàu ñaõ cho (baøi toaùn 3) roài sau khi xöû lyù maûng 1 chieàu naøy, ta seõ gaùn chuùng trôû laïi maûng 2 chieàu ñaõ cho theo qui taéc baøi toaùn ñoøi hoûi.

a) Haõy saép xeáp laïi maûng 2 chieàu sao cho caùc phaàn töû cuûa chuùng coù giaù trò taêng daàn töø traùi sang phaûi, töø treân xuoáng döôùi.

Program Sap_xep_mang_2_chieu;USES CRT;Const DIM=10; MaxNum=1000; Step=5;TYPE Mang2=Array[1..DIM,1..DIM] of Integer; Mang1=Array[1..DIM*DIM] of Integer;VAR m,n,i,j:Integer; A:Mang2; B:Mang1;{*****************************}PROCEDURE NHAP(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2;

Page 17: TL BDHSG Mang 2 Chieu

ClrScr; GotoXY(X+((Step*n-15)Div 2),y-2); Writeln('Nhap ma tran ',m,' dong ',n,' cot'); For i:=1 To m Do For j:=1 To n Do REPEAT GotoXY(X+(j-1)*Step,Y+i-1); Write('':Step); GotoXY(X+(j-1)*Step,Y+i-1); Readln(A[i,j]); UNTIL (ABS(A[i,j])<MaxNum);End;{*****************************}PROCEDURE HIENTHI(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr; GotoXY(X+((Step*n-15) Div 2),Y-2); Write('Xuat ma tran'); For i:=1 To m Do For j:=1 To n Do Begin GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3); End;End;{*****************************}Procedure TAOMANG1CHIEU(VAR A:Mang2;m,n:Integer;VAR B:Mang1);Var i,j :Integer;Begin For i:=1 To m Do For j:=1 To n Do B[(i-1)*n+j]:=A[i,j];End;{*****************************}Procedure SAPXEP(var B:Mang1;n:Integer);Var i,j,Temp :Integer;Begin

Page 18: TL BDHSG Mang 2 Chieu

For i:=1 To N Do For j:=i+1 To N Do If B[i]>B[j] Then Begin Temp:=B[i]; B[i]:=B[j]; B[j]:=Temp; End;End;{*****************************}BEGINClrScr;Randomize;Write('So dong: ');Readln(m);Write('So cot: ');Readln(n);Nhap(A,m,n);Readln;HienThi(A,m,n);Readln;TaoMang1Chieu(A,m,n,B);Sapxep(B,m*n);For i:=1 To m Do For j:=1 To n Do A[i,j]:=B[(i-1)*n+j];Writeln('Mang da sap xep');HienThi(A,m,n);READLN;END.

b) Haõy saép xeáp laïi ma traän vuoâng A[n,n] sao cho caùc phaàn töû cuûa chuùng coù giaù trò taêng daàn theo ñöôøng xoaén oác töø ngoaøi vaøo trong nhö hình veõ sau:

Xuaát phaùt

YÙ töôûng thuaät giaûi : Coâng vieäc ñaàu tieân laø phaûi bieán ma traän ñaõ cho

A[n,n] thaønh 1 maûng 1 chieàu (nhö ñaõ nghieân cöùu trong baøi toaùn 3).

Page 19: TL BDHSG Mang 2 Chieu

Böôùc tieáp theo laø saép xeáp maûng 1 chieàu vöøa ñöôïc taïo laäp.

Cuoái cuøng laø ñieàn maûng 1 chieàu trôû laïi vaøo ma traän vuoâng vaø ñaûm baûo caùc phaàn töû ñöôïc ñieàn vaøo theo hình xoaén oác, chuù yù :

+ ÔÛ doøng 1 thì cho coät taêng daàn.+ ÔÛû coät N thì seõ cho haøng taêng daàn.+ ÔÛ haøng N thì coät giaûm daàn.+ ÔÛ coät 1 thì doøng giaûm daàn.Chu trình treân cöù tieáp theo cho ñeán khi kín ma

traän ñaõ cho (phaàn töû cuoái cuøng cuûa maûng 1 chieàu = n x n)

Xin môøi caùc baïn “xem qua” chöông trình sau, chuù yù ñeán phaàn ñieàn giaù trò vaøo ma traän cuoái cuøng

Program Sap_xep_mang_2_chieu_theo_hinh_tron_oc;USES CRT;Const DIM=10; MaxNum=1000; Step=5;TYPE Mang2=Array[1..DIM,1..DIM] of Integer; Mang1=Array[1..DIM*DIM] of Integer;VAR i,j,n,L,k:Integer; Num,Dir:Integer; A:Mang2; B:Mang1;{*****************************}PROCEDURE NHAP(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr; GotoXY(X+((Step*n-15)Div 2),y-2); Writeln('Nhap ma tran ',m,' dong ',n,' cot');

For i:=1 To m Do For j:=1 To n Do REPEAT

Page 20: TL BDHSG Mang 2 Chieu

GotoXY(X+(j-1)*Step,Y+i-1); Write('':Step); GotoXY(X+(j-1)*Step,Y+i-1); Readln(A[i,j]); UNTIL (ABS(A[i,j])<MaxNum);End;{*****************************}PROCEDURE HIENTHI(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr; GotoXY(X+((Step*n-15) Div 2),Y-2); Write('Xuat ma tran'); For i:=1 To m Do For j:=1 To n Do Begin GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3); End;End;{*****************************}Procedure TAOMANG1CHIEU(VAR A:Mang2;m,n:Integer;VAR B:Mang1);Var i,j :Integer;Begin For i:=1 To m Do For j:=1 To n Do B[(i-1)*n+j]:=A[i,j];End;{*****************************}Procedure SAPXEP(var B:Mang1;n:Integer);Var i,j,Temp :Integer;Begin For i:=1 To N Do For j:=i+1 To N Do If B[i]>B[j] Then Begin Temp:=B[i]; B[i]:=B[j]; B[j]:=Temp;

Page 21: TL BDHSG Mang 2 Chieu

End;End;{*****************************}BEGINClrScr;Randomize;Repeat Write('Canh cua ma tran: ');Readln(n);Until (n>0) and (n<=dim);Nhap(A,n,n);Readln;TaoMang1Chieu(A,n,n,B);Sapxep(B,n*n);{Ñieàn giaù trò cho ma traän keát quaû}L:=0;i:=1;j:=1;Num:=N-1;Dir:=0;While L<n*n Do Begin Case DIR of 0:Begin For k:=0 to Num Do Begin Inc(L); A[i,j+k]:=B[L]; End; Inc(Dir); Inc(j,Num); End; 1:Begin For k:=1 to Num Do Begin Inc(L); A[i+k,j]:=B[L]; End; Inc(Dir); Inc(i,Num); End; 2:Begin For k:=1 to Num Do Begin Inc(L); A[i,j-k]:=B[L]; End; Inc(Dir);

Page 22: TL BDHSG Mang 2 Chieu

Dec(j,Num); End; 3:Begin Dec(Num); For k:=1 to Num Do Begin Inc(L); A[i-k,j]:=B[L]; End; Dir:=0; Dec(i,Num); Inc(j); Dec(Num); End; End;End;Hienthi(A,N,N);READLN;END.

b) Haõy saép xeáp laïi ma traän vuoâng A[n,n] sao cho caùc phaàn töû cuûa chuùng coù giaù trò taêng daàn ñi theo ñöôøng Zigzac nhö hình veõ sau:

Cuõng töông töï nhö baøi toaùn treân nhöng söï phöùc taïp cuûa baøi toaùn naøy laø söï ñoåi höôùng lieân tuïc trong quaù trình xaây döïng ma traän keát quaû.

YÙ töôûng thuaät toaùn: Duyeät theo ñöôøng zigzac thöïc teá laø laàn löôït duyeät

theo caùc ñöôøng cheùo, moãi laàn laïi ñoåi chieàu. Moät ma traän coù n phaàn töû thì soá ñöôøng cheùo seõ

laø 2n – 1 (tính caû ñöôøng cheùo chæ coù 1 ñieåm laø A[1,1) vaø A[n,n]

Page 23: TL BDHSG Mang 2 Chieu

Neáu ta ñaùnh soá caùc ñöôøng cheùo theo thöù töï töø 2 ñeán 2n thì moãi ñieàm A[i,j] naèm treân ñöôøng cheùo k seõ thoûa maõn I+j=k (vôùi k [2..2n])

Toïa ñoä coät j treân moãi ñöôøng cheùo k phaûi thoûa maõn ñieàu kieän:+ j seõ taêng töø 1 ñeán k neáu k<=n+ k seõ taêng töø k-n ñeán N neáu k>n

Baøi toaùn seõ qui veà tröôøng hôïp taïo laàn löôït 2n – 1 ñöôøng cheùo thoûa maõn caùc tính chaát treân.

Môøi caùc baïn tham khaûo chöông trình sau:

Program Sap_xep_mang_2_chieu_theo_hinh_zig_zac;USES CRT;Const DIM=10; MaxNum=1000; Step=5;TYPE Mang2=Array[1..DIM,1..DIM] of Integer; Mang1=Array[1..DIM*DIM] of Integer;VAR i,j,n,m,L,k:Integer; Num,Dir:Integer; A:Mang2; B:Mang1;{*****************************}PROCEDURE NHAP(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr; GotoXY(X+((Step*n-15)Div 2),y-2); Writeln('Nhap ma tran ',m,' dong ',n,' cot');

For i:=1 To m Do For j:=1 To n Do REPEAT GotoXY(X+(j-1)*Step,Y+i-1); Write('':Step); GotoXY(X+(j-1)*Step,Y+i-1); Readln(A[i,j]);

Page 24: TL BDHSG Mang 2 Chieu

UNTIL (ABS(A[i,j])<MaxNum);End;{*****************************}PROCEDURE HIENTHI(var A:Mang2;m,n:Integer);VAR i,j,x,y:Integer;Begin X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr; GotoXY(X+((Step*n-15) Div 2),Y-2); Write('Xuat ma tran'); For i:=1 To m Do For j:=1 To n Do Begin GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3); End;End;{*****************************}Procedure TAOMANG1CHIEU(VAR A:Mang2;m,n:Integer;VAR B:Mang1);Var i,j :Integer;Begin For i:=1 To m Do For j:=1 To n Do B[(i-1)*n+j]:=A[i,j];End;{*****************************}Procedure SAPXEP(var B:Mang1;n:Integer);Var i,j,Temp :Integer;Begin For i:=1 To N Do For j:=i+1 To N Do If B[i]>B[j] Then Begin Temp:=B[i]; B[i]:=B[j]; B[j]:=Temp; End;End;{*****************************}BEGIN

Page 25: TL BDHSG Mang 2 Chieu

ClrScr;Randomize;Repeat Write('Canh cua ma tran: ');Readln(n);Until (n>0) and (n<=dim);Nhap(A,n,n);Readln;TaoMang1Chieu(A,n,n,B);Sapxep(B,n*n);L:=0;Dir:=0;For Num:=2 To n+n Do Begin If Num>n Then Begin k:=Num-n; m:=n; End Else Begin k:=1; m:=Num-1; End; Case Dir of 0:Begin For j:=k To m Do Begin Inc(L); A[Num-j,j]:=B[L]; End; Dir:=1; End; 1:Begin For j:=m DownTo k Do Begin Inc(L); A[Num-j,j]:=B[L]; End; Dir:=0; End; End;End;HienThi(A,N,N);Hienthi(A,N,N);READLN;END.

{-------------------------------------------------------}

Page 26: TL BDHSG Mang 2 Chieu

Baøi taäp :1. Tìm taát caùc phaàn töû A[i,j] > 0 naèm giöõa caùc

phaàn töû <=0 trong moät ma traän vuoâng A[n,n].2. Tìm caùc phaàn töû cuûa 1 ma traän vuoâng laø MIN

hoaëc MAX cuûa caùc phaàn töû naèm treân 2 ñöôøng cheùo.

3. Vieát chöông trình saép xeáp caùc phaàn töû cuûa ma traän vuoâng A[n,n] sao cho caùc phaàn töû cuûa noù taêng daàn khi ñi theo döôøng zigzag nhö hình veõ:

4. Vieát chöông trình saép xeáp caùc phaàn töû cuûa ma traän vuoâng A[n,n] (vôùi n=2k+1) sao cho toång caùc doøng, caùc coät vaø caùc ñöôøng cheùo ñeàu baèng nhau (Baøi toaùn ma phöông).