Đề 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 90 0 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; End; 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; Begin 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 Begin 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) . 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. 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 = &apos ;somau. inp'; Type Pt = Record x,y : Byte ; End; MangM = Array[0 Max,0 Max] of Byte; MangQ