Всем привет! У меня есть произвольная фигура (массив с позициями квадратов 1*1), мне нужно ее разделить на прямоугольники и сделать массив, который хранит начало и конец каждого прямоугольника(startX, startY, endX, endY). Выполнить нужно на C#. В приложении есть пример фигуры до и после разбиения на прямоугольники. Прямоугольников должно быть минимальное количество.
Для перевода числа из десятичной системы счисления в двоичную нужно делить это число на 2 до тех пор, пока не получим ноль, и остатки выписывать. Делить нужно нацело, то есть дробной части быть не должно.
Теперь записываем остатки снизу вверх (хотя тут не важно): 1001
9(10) = 1001(2).
Второй
9 = 8 + 1 = 2^3 + 2^0
Число 2 в какой-либо степени в системе счисления с основанием 2 представляет собой единицу, после которой идут нули, количество которых равно этой степени:
// PascalABC.NET 3.2, сборка 1379 от 21.01.2017 // Внимание! Если программа не работает, обновите версию!
begin var ЕстьКусков,НадоКусков:integer; Readln(ЕстьКусков,НадоКусков); var Длины:=ReadArrInteger(ЕстьКусков); var ОбщаяДлина:=Длины.Sum; if НадоКусков>ОбщаяДлина then Writeln(0) else begin var ДлинаКуска:=ОбщаяДлина div НадоКусков; repeat if Длины.Select(Кусок->Кусок div ДлинаКуска).Sum >=НадоКусков then break else ДлинаКуска-=1; until false; writeln(ДлинаКуска) end end.
Делить нужно нацело, то есть дробной части быть не должно.
9 / 2 = 4, остаток 1
4 / 2 = 2, остаток 0
2 / 2 = 1, остаток 0
1 / 2 = 0, остаток 1
Теперь записываем остатки снизу вверх (хотя тут не важно): 1001
9(10) = 1001(2).
Второй
9 = 8 + 1 = 2^3 + 2^0
Число 2 в какой-либо степени в системе счисления с основанием 2 представляет собой единицу, после которой идут нули, количество которых равно этой степени:
2^3 = 1000(2)
2^1 = 1(2)
1000(2) + 1(2) = 1001(2)
// Внимание! Если программа не работает, обновите версию!
begin
var ЕстьКусков,НадоКусков:integer;
Readln(ЕстьКусков,НадоКусков);
var Длины:=ReadArrInteger(ЕстьКусков);
var ОбщаяДлина:=Длины.Sum;
if НадоКусков>ОбщаяДлина then Writeln(0)
else begin
var ДлинаКуска:=ОбщаяДлина div НадоКусков;
repeat
if Длины.Select(Кусок->Кусок div ДлинаКуска).Sum >=НадоКусков then break
else ДлинаКуска-=1;
until false;
writeln(ДлинаКуска)
end
end.
Пример
4 11
802 743 457 539
200