Даю много баллов, только с полным изъясненьем Дана клетчатая фигура в виде
Даю много баллов, только с полным разъясненьем
Дана клетчатая фигура в виде лестницы, содержащей n ступенек (на рисунке приведён пример для n=11).Сколько значений n, удовлетворяющих неравенству 300lt;nlt;700 , для которых данную лестницу можно разрезать на уголки из трёх клеток?
1 ответ
Игорек Ярыжкин
Решение состоит из двух программ.
1) Способом перебора определяем, что на уголки можно разрезать треугольники со стороной 2, 6, 8, 9, и 11. Треугольники со гранями 3 и 5 разрезать не получится.
2) Подмечаем, что из двух уголков можно составить прямоугольник 2*3 (назовем его "универсальный кирпичик"), а из 12 уголков - квадрат 6*6.
3) Сейчас мы можем разрезать большую фигуру на квадраты 6*6 и треугольники со стороной 6. В остатке будут "полосы" шириной n и вышиной 1, 2, 3, 4, 5.
4) Замечаем, что из универсальных кирпичиков - прямоугольников 2*3 можно составить такие фигуры, как 6*11 (6+3+2), 6*9 (6+3), 6*2 (2 кирпичика, лежащих горизонтально).
5) Итак, чтоб разрезать великую фигуру на уголки, мы разрезаем ее сверху вниз на квадраты и треугольники со стороной 6, пока не порежем всю фигуру, или получим в остатке полоску вышиной 2, 9, или 11 и шириной n.
6) Из шага (1) нам знаменито, что треугольники размером a = 2, 9 и 11 можно порезать на уголки. После этого остается полоса размером (n - a)*a, но (n - a) делится на 6, потому мы можем порезать ее на прямоугольники 2*3, как следует из шага 4.
7) Окончательно, фигуру можно разрезать на уголки только тогда, когда число ее клеток кратно 3.
Решение методом полного перебора для первых n:
uses crt, math;
var matrix: array[1..700] of array[1..700] of smallint;
маркер для красоты
var m: integer;
var total, n: integer;
var iteration: extended;
x, y
type TCoords = array[1..2] of smallint;
procedure clear_matrix();
var x, y: integer;
begin
for y:= 1 to 700 do begin
for x := 1 to y do begin
свободно
matrix[x][y] := 0;
end;
for x := y + 1 to 700 do begin
граница
matrix[x][y] := 2;
end;
end;
end;
procedure print_matrix();
var v, x, y: integer;
begin
for y:= 1 to 20 do begin
for x := 1 to 20 do begin
v := matrix[x][y];
if v = 2 then write(' ') else write(v);
end;
writeln();
end;
end;
координата первой свободной клеточки либо (0,0) если все клеточки заняты
function first_empty(): TCoords;
var x, y: integer;
var coords: TCoords;
label done;
begin
coords[1] := 0;
coords[2] := 0;
for y := 1 to n do begin
for x := 1 to n do begin
if matrix[x][y] = 0 then begin
coords[1] := x;
coords[2] := y;
goto done;
end;
end;
end;
done:
first_empty := coords;
end;
function solve_matrix(): integer;
var coords: TCoords;
var r, i, x, y: integer;
label solved;
begin
iteration := iteration + 1;
coords := first_empty();
x := coords[1];
y := coords[2];
m := m + 1;
if m gt; 9 then m := 3;
if x lt;gt; 0 then begin
if matrix[x][y] lt;gt; 0 then write('!');
if (x lt; n) and (y lt; n) then begin
общее
matrix[x][y] := m;
@-
if (x + 1) lt;gt; y then begin
if (matrix[x][y + 1] = 0) and (matrix[x + 1][y + 1] = 0) then begin
matrix[x][y + 1] := m;
matrix[x + 1][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x][y + 1] := 0;
matrix[x + 1][y + 1] := 0;
end
end;
[email protected]
if (x gt; 1) and (y gt; 1) then begin
if (matrix[x - 1][y + 1] = 0) and (matrix[x][y + 1] = 0) then begin
matrix[x - 1][y + 1] := m;
matrix[x][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x - 1][y + 1] := 0;
matrix[x][y + 1] := 0;
end
end;
@
-
if y gt; 1 then begin
if (matrix[x + 1][y] = 0) and (matrix[x + 1][y + 1] = 0) then begin
matrix[x + 1][y] := m;
matrix[x + 1][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x + 1][y] := 0;
matrix[x + 1][y + 1] := 0;
end
end;
@
if (y gt; 1) then begin
if (matrix[x + 1][y] = 0) and (matrix[x][y + 1] = 0) then begin
matrix[x + 1][y] := m;
matrix[x][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x + 1][y] := 0;
matrix[x][y + 1] := 0;
end
end;
общее
matrix[x][y] := 0;
end;
фигура не может быть разрезана
solve_matrix := 0;
end
else begin
все клетки заполнены - фигура разрезана
writeln('solved: n=', n:3, ', iterations: ', iteration:15:0);
print_matrix();
total := total + 1;
solved:
solve_matrix := 1;
end;
end;
begin
total := 0;
m := 3;
основной цикл
for n := 1 to 120 do begin
если число клеток не кратно трем, то разрезать не получится
if n*(n + 1) mod 6 = 0 then begin
iteration := 0;
clear_matrix();
if solve_matrix() = 0 then writeln('not solved: n=', n:3);
end;
end;
writeln('total: ', total);
end.
Решение для произвольных n:
uses math;
var i: integer;
var s: integer;
var y: integer;
var n: integer;
begin
y := 0;
n := 0;
for i := 301 to 699 do begin
число клеток (сумма арифметической прогрессии) кратно 3
if i * (i + 1) mod 6 = 0 then begin
s := i;
while s gt; 0 do begin
if (s = 0) or (s = 2) or (s = 9) or (s = 11) then begin
y := y + 1;
break
end else begin
никогда не производится
if s lt; 6 then begin
n := n + 1;
end;
end;
s := s - 6;
end;
end;
end;
writeln();
writeln('yes: ', y);
writeln('no: ', n);
end.
Ответ: 200.
1) Способом перебора определяем, что на уголки можно разрезать треугольники со стороной 2, 6, 8, 9, и 11. Треугольники со гранями 3 и 5 разрезать не получится.
2) Подмечаем, что из двух уголков можно составить прямоугольник 2*3 (назовем его "универсальный кирпичик"), а из 12 уголков - квадрат 6*6.
3) Сейчас мы можем разрезать большую фигуру на квадраты 6*6 и треугольники со стороной 6. В остатке будут "полосы" шириной n и вышиной 1, 2, 3, 4, 5.
4) Замечаем, что из универсальных кирпичиков - прямоугольников 2*3 можно составить такие фигуры, как 6*11 (6+3+2), 6*9 (6+3), 6*2 (2 кирпичика, лежащих горизонтально).
5) Итак, чтоб разрезать великую фигуру на уголки, мы разрезаем ее сверху вниз на квадраты и треугольники со стороной 6, пока не порежем всю фигуру, или получим в остатке полоску вышиной 2, 9, или 11 и шириной n.
6) Из шага (1) нам знаменито, что треугольники размером a = 2, 9 и 11 можно порезать на уголки. После этого остается полоса размером (n - a)*a, но (n - a) делится на 6, потому мы можем порезать ее на прямоугольники 2*3, как следует из шага 4.
7) Окончательно, фигуру можно разрезать на уголки только тогда, когда число ее клеток кратно 3.
Решение методом полного перебора для первых n:
uses crt, math;
var matrix: array[1..700] of array[1..700] of smallint;
маркер для красоты
var m: integer;
var total, n: integer;
var iteration: extended;
x, y
type TCoords = array[1..2] of smallint;
procedure clear_matrix();
var x, y: integer;
begin
for y:= 1 to 700 do begin
for x := 1 to y do begin
свободно
matrix[x][y] := 0;
end;
for x := y + 1 to 700 do begin
граница
matrix[x][y] := 2;
end;
end;
end;
procedure print_matrix();
var v, x, y: integer;
begin
for y:= 1 to 20 do begin
for x := 1 to 20 do begin
v := matrix[x][y];
if v = 2 then write(' ') else write(v);
end;
writeln();
end;
end;
координата первой свободной клеточки либо (0,0) если все клеточки заняты
function first_empty(): TCoords;
var x, y: integer;
var coords: TCoords;
label done;
begin
coords[1] := 0;
coords[2] := 0;
for y := 1 to n do begin
for x := 1 to n do begin
if matrix[x][y] = 0 then begin
coords[1] := x;
coords[2] := y;
goto done;
end;
end;
end;
done:
first_empty := coords;
end;
function solve_matrix(): integer;
var coords: TCoords;
var r, i, x, y: integer;
label solved;
begin
iteration := iteration + 1;
coords := first_empty();
x := coords[1];
y := coords[2];
m := m + 1;
if m gt; 9 then m := 3;
if x lt;gt; 0 then begin
if matrix[x][y] lt;gt; 0 then write('!');
if (x lt; n) and (y lt; n) then begin
общее
matrix[x][y] := m;
@-
if (x + 1) lt;gt; y then begin
if (matrix[x][y + 1] = 0) and (matrix[x + 1][y + 1] = 0) then begin
matrix[x][y + 1] := m;
matrix[x + 1][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x][y + 1] := 0;
matrix[x + 1][y + 1] := 0;
end
end;
[email protected]
if (x gt; 1) and (y gt; 1) then begin
if (matrix[x - 1][y + 1] = 0) and (matrix[x][y + 1] = 0) then begin
matrix[x - 1][y + 1] := m;
matrix[x][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x - 1][y + 1] := 0;
matrix[x][y + 1] := 0;
end
end;
@
-
if y gt; 1 then begin
if (matrix[x + 1][y] = 0) and (matrix[x + 1][y + 1] = 0) then begin
matrix[x + 1][y] := m;
matrix[x + 1][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x + 1][y] := 0;
matrix[x + 1][y + 1] := 0;
end
end;
@
if (y gt; 1) then begin
if (matrix[x + 1][y] = 0) and (matrix[x][y + 1] = 0) then begin
matrix[x + 1][y] := m;
matrix[x][y + 1] := m;
r := solve_matrix();
if r lt;gt; 0 then begin
goto solved;
end;
восстанавливаем
matrix[x + 1][y] := 0;
matrix[x][y + 1] := 0;
end
end;
общее
matrix[x][y] := 0;
end;
фигура не может быть разрезана
solve_matrix := 0;
end
else begin
все клетки заполнены - фигура разрезана
writeln('solved: n=', n:3, ', iterations: ', iteration:15:0);
print_matrix();
total := total + 1;
solved:
solve_matrix := 1;
end;
end;
begin
total := 0;
m := 3;
основной цикл
for n := 1 to 120 do begin
если число клеток не кратно трем, то разрезать не получится
if n*(n + 1) mod 6 = 0 then begin
iteration := 0;
clear_matrix();
if solve_matrix() = 0 then writeln('not solved: n=', n:3);
end;
end;
writeln('total: ', total);
end.
Решение для произвольных n:
uses math;
var i: integer;
var s: integer;
var y: integer;
var n: integer;
begin
y := 0;
n := 0;
for i := 301 to 699 do begin
число клеток (сумма арифметической прогрессии) кратно 3
if i * (i + 1) mod 6 = 0 then begin
s := i;
while s gt; 0 do begin
if (s = 0) or (s = 2) or (s = 9) or (s = 11) then begin
y := y + 1;
break
end else begin
никогда не производится
if s lt; 6 then begin
n := n + 1;
end;
end;
s := s - 6;
end;
end;
end;
writeln();
writeln('yes: ', y);
writeln('no: ', n);
end.
Ответ: 200.
, оставишь ответ?
Похожие вопросы
-
Вопросы ответы
Новое
NEW
Статьи
Информатика
Статьи
Последние вопросы
Игорь 14 лет назад был на 8 лет моложе, чем его
Математика.
Два тела массами m1 и m2 находящие на расстоянии R друг
Физика.
В сосуде 4целых одна пятая литр воды что бы заполнить сосуд
Математика.
Двум малярам Диме И Олегу поручили выкрасить фасад дома они разделили
Разные вопросы.
найти порядковый номер 41Э если в ядре 20 нейтронов
Разные вопросы.
в ряду натуральных чисел 3, 8, 10, 24, … 18 одно
Математика.
Предприятие по производству с/хоз продукции на производство затратило 3527000 руб Валовый
Разные вопросы.
Математика, задано на каникулы. ВАРИАНТ 1004
НОМЕР 1,2,3,4,5,6,7,8.
Математика.
Имеются три конденсатора емкостью С1=1мкФ, С2=2мкФ и С3=3мкФ. Какую наименьшую емкость
Физика.
Из точки м выходят 3 луча MP MN и MK причём
Геометрия.
Облако тегов