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.