Pascal
Modified: Wednesday, 22-12-2021 07:00 AM
Cho hình chữ nhật có kích thước (M x N)
Mỗi lần được phép cắt hình chữ nhật theo chiều ngang hay chiều dọc và lại tiếp tục cắt các hình chữ nhật con cho đến khi tất cả đều là hình vuông.
<Kích thước của các hình vuông không nhất thiết phải bằng nhau.>
► Yêu cầu: Tìm cách cắt hình chữ nhật (MxN) thành ít hình vuông nhất.
► Dữ liệu vào: 2 số đo M, N
► Dữ liệu ra: Số lượng hình vuông ít nhất.
M | N | V |
---|---|---|
10 | 2 | 5 |
5 | 6 | 5 |
100 | 25 | 4 |
5 | 3 | 4 |
3 | 2 | 3 |
var M,N:integer;
dem:integer;
arr:array[1..2] of integer;
// Doi so lon ra truoc
procedure swap(var a,b:integer);
var temp:integer;
begin
if a < b then
begin
temp := a;
a := b;
b := temp;
end;
end;
//truong hop dac biet
procedure SpecialCase(a,b:integer);
var i,x,y:integer;
begin
for i:=3 to a div 2 do
begin
x := a div i;
y := a div(b-i);
if (x*i=a) and (y*(b-i)=a) then
begin
arr[1] := x+y;
exit;
end;
end;
end;
// Truong hop thong thuong
procedure NormalCase(M,N:integer);
begin
while not (M=0) or (N=0) do
begin
swap(M,N);
dem := dem + (M div N);
M := M mod N;
end;
if (dem < arr[1]) or (arr[1]=0) then
arr[1]:=dem;
end;
// Main
begin
write('Nhap M: ');
readln(M);
write('Nhap N: ');
readln(N);
dem := 0;
swap(M,N);
SpecialCase(M,N);
NormalCase(M,N);
writeln('So hinh vuong it nhat: ',arr[1]);
readln;
end.