Vùng các ô có giá trị 1 chung cạnh gọi là một vùng liên thông.. Nếu trong hình chữ nhật này chỉ có một vùng liên thông thì vùng này gọi là một mẫu.. Câu a : Nhập từ file SOMAU.INP hai số
Trang 1Đề bài :
Cho một hình chữ nhật n*m ô vuông, mỗi ô vuông nhận giá trị 0 hoặc 1 Vùng các
ô có giá trị 1 chung cạnh gọi là một vùng liên thông Nếu trong hình chữ nhật này chỉ có một vùng liên thông thì vùng này gọi là một mẫu
Câu a : Nhập từ file SOMAU.INP hai số nguyên m,n và hai hình chữ nhật Thông báo hai hình chữ nhật đó có phải là hai mẫu không
Câu b : Hai mẫu gọi là tơng đơng nếu diện tích của chúng bằng nhau Nếu câu a đợc hai mẫu thì hai mẫu đó đợc tơng đơng không
Câu c : Đặt hai mẫu trên cùng một hệ trục toạ độ, nếu tịnh tiến dọc các trục mà hai mẫu trùng khít lên nhau thì ta nói hai mẫu đó bằng nhau Nếu câu b đợc hai mẫu tơng
đ-ơng thì hai mẫu đó bằng nhau hay không?
Câu d : Nếu kết hợp thực hiện tịnh tiến dọc các trục toạ độ và phép quay một mẫu, một góc dơng 900 mà hai mẫu trùng khít lên nhau thì ta nói hai mẫu bằng nhau kiểu 2 Kiểm tra hai mẫu đã nhập trong file có bằng nhau kiểu 2 hay không?
Lời giải:
(học sinh tự làm câu d)
Uses Crt;
Const Max = 50;
Fi = 'somau.inp';
Type Pt = Record x,y : Byte ; End;
MangM = Array[0 Max,0 Max] of Byte;
MangQ = Array[1 Max*Max] of Pt;
MangD = Array[1 Max,1 Max] of Pt;
Var N,M : Byte;
A,B : MangM;
Q : MangQ;
D : MangD;
S1,S2 : Integer;
(* -*)
Procedure NhapFile;
Var i,j : Byte;
F : Text;
Begin
FillChar(A,Sizeof(A),3);
FillChar(B,Sizeof(B),3);
Assign(F,Fi);
Reset(F);
Readln(F,M,N);
For i:=1 to M do
For j:=1 to N do Read(F,A[i,j]);
For i:=1 to M do
For j:=1 to N do Read(F,B[i,j]);
Close(F);
End;
(* -*)
Function Tim1(Var MX : MangM; Var x,y : Byte): Boolean;
Var i,j : Byte;
Begin
For i:=1 to M do
For j:=1 to N do
If MX[i,j]=1 then
Begin
x := i;
y := j;
Tim1 := True;
Exit;
Trang 2End;
Tim1 := False;
End;
(* -*)
Function Mau(Var MX : MangM;Var DT : Integer) : Boolean; Var Ok : Boolean;
F,L : Integer;
x,y,k : Byte;
Procedure Loang(Var MX : MangM; x,y,i,j : Byte);
Begin
If MX[i,j]=1 then
Begin
MX[i,j] := 2;
Inc(L);
Q[L].x := i;
Q[L].y := j;
D[i,j].x := x;
D[i,j].y := y;
End
Else
If (MX[i,j]=2) and ((i<>D[x,y].x) or (j<>D[x,y].y)) then Ok := True;
End;
Begin
Ok := False;
If Tim1(MX,x,y) then
Begin
F := 0;
L := 1;
Q[L].x := x;
Q[L].y := y;
MX[x,y] := 2;
Repeat
Inc(F);
x := Q[F].x;
y := Q[F].y;
Loang(MX,x,y,x-1,y);
Loang(MX,x,y,x+1,y);
Loang(MX,x,y,x,y-1);
Loang(MX,x,y,x,y+1);
Until F=L;
If Tim1(MX,x,y) then Ok := False;
Mau := Ok;
DT := L;
End;
End;
Function Thongbao(Var X : MangM; Var S : Integer) : Boolean; Begin
S := 0;
If Not Mau(X,S) then
Begin
Writeln('Du lieu khong dung ');
Thongbao := False;
Exit;
End;
Thongbao := True;
End;
Procedure Timkhung(Var X : MangM; Var x1,y1,x2,y2 : Byte); Function MinD : Byte;
Var i,j : Byte;
Trang 3Begin
For i:=1 to M do
For j:=1 to N do
If X[i,j]=2 then
Begin
MinD := i;
Exit;
End;
End;
Function MaxD : Byte;
Var i,j : Byte;
Begin
For i:=M downto 1 do
For j:=1 to N do
If X[i,j]=2 then
Begin
MaxD := i;
Exit;
End;
End;
Function MaxC : Byte;
Var i,j : Byte;
Begin
For j:=N downto 1 do
For i:=1 to M do
If X[i,j]=2 then
Begin
MaxC := j;
Exit;
End;
End;
Function MinC : Byte;
Var i,j : Byte;
Begin
For j:=1 to N do
For i:=1 to M do
If X[i,j]=2 then
Begin
MinC := j;
Exit;
End;
End;
Begin
x1 := MinD;
x2 := MaxD;
y1 := MinC;
y2 := MaxC;
End;
(* -*)
Function Trung : Boolean;
Var xa1,xa2,xb1,xb2,ya1,ya2,yb1,yb2,i,j : Byte;
Ok : Boolean;
L1,L2,x,y : Byte;
Begin
TimKhung(A,xa1,ya1,xa2,ya2);
TimKhung(B,xb1,yb1,xb2,yb2);
L1 := Abs(xa1-xb1);
L2 := Abs(ya1-yb1);
Trung := True;
If (xa2-xa1)*(ya2-ya1)=(xb2-xb1)*(yb2-yb1) then
Trang 4Begin
For i:= xa1 to xa2 do
For j:= ya1 to ya2 do
If A[i,j]=2 then
Begin
If xa1<xb1 then x := i+L1
Else
If xa1>xb1 then x := i-l1
Else x := i;
If ya1<yb1 then y := j+L2
Else
If ya1>yb1 then y := j-L2
Else y := j;
If A[i,j]<>B[x,y] then
Begin
Trung := False;
Exit;
End;
End;
End
Else
Trung := False;
End;
BEGIN
NhapFile;
Clrscr;
If Thongbao(A,S1) and Thongbao(B,S2) then
If S1=S2 then
Begin
Writeln('Hai mau tuong duong ve mat dien tich ');
If Trung then Writeln('Hai mau co the tinh tien trung nhau ')
Else Writeln('Hai mau khong the tinh tien trung nhau ');
End
Else
Writeln('hai mau khong tuong duong, khong trung nhau ');
Writeln('ENTER thoat ');
Readln;
END
(Gi¸o viªn TrÇn §ç Hïng - Céng t¸c viªn NguyÔn Träng TuÊn)