Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 07:34   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию Геометрическая задача

Утро Доброе
Вчера на информатике, когда весь класс проходил Write, мне дали решать задачки на различные темы. И если с простыми числами-близнецами, с совершенными числами, etc я справился в легкую, одно ужасно простая задача выбила меня из рабочей калии.

Собственно задача : Есть пол, размером N на M. И есть квадратики со стороной K. Каким наименьшим кол-вом квадратиков можно покрыть пол?

Сначала я пытался нахимичить с DIV и MOD. Затем я решил, поняв что времени у меня мало, и вывести обобщенную формулу у меня не получится, я загнал всё в матрицу. В состоянии аффекта, задачу я не решил, придя же домой нашел у себя ошибку.. Программа, вроде, работает, но решать относительно простую задачу с помощью двух мерных массивов - перебор!
Поэтому не подскажете ли Вы более красивое решение ?

Мое решение :
Код:
var
    a : array [1..100, 1..100] of Integer;
    n, m, k, count, i, j, i1, j1 : Integer;

begin
    Read (n, m, k);

    for i := 1 to n do
        for j := 1 to m do
            a[i, j] := 1;


    count := 0;

    for i := 1 to n do
        for j := 1 to m do

            if a[i, j] = 1 then begin
                Inc(count);
                for i1 := i to i+k-1 do
                    for j1 := j to j+k-1 do
                        a[i1, j1] := 0

            end;

    WriteLn (count)
end.
Poma][a вне форума Ответить с цитированием
Старый 20.03.2013, 08:03   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
из рабочей калии.
Калия - это производная от какого слова?

Общую площадь на площадь квадрата делить не пробовал?

Код:
y=(n*m) div (k*k);
Вопрос возникает - можно ли эту плитку резать, чтоб замостить остальное? Или использовать только целые квадраты?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 20.03.2013 в 08:11.
Sciv вне форума Ответить с цитированием
Старый 20.03.2013, 08:30   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Вопрос возникает - можно ли эту плитку резать, чтоб замостить остальное? Или использовать только целые квадраты?
с целыми тоже не столь сложно:

Код:
y := (n div k + (n mod k > 0)) * (m div k + (m mod k > 0));
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 20.03.2013, 08:56   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

думаю, что некоторые квадраты можно класть друг на друга "в нахлёст" (иначе задачу невозможно решить, например, для пола размером 5 x 5 и плиткой K=3

если покрытие допускается, тогда всё просто:
Код:
var
  N, M, K : integer;
  Kvadrtov_po_n,   Kvadrtov_po_m : integer;
begin
  Readln(N, M, K);
  Kvadrtov_po_n := n div K + ord((n mod K) <> 0);
  Kvadrtov_po_m := m div K + ord((m mod K) <> 0);

  WriteLn('Kolichesto plitok = ',Kvadrtov_po_n*Kvadrtov_po_m);
  Readln
end.
Всё настолько просто, что мне кажется, что я чего-то не учёл!


p.s. ну и разумеется, если плитку можно (нужно) резать - тогда это решение не подходит! Но об этом же должно быть сказано в условии!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.03.2013, 09:28   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Всё настолько просто, что мне кажется, что я чего-то не учёл!
Так ведь задача-то для школьников
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.03.2013, 09:34   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

В условии всё предельно ясно сказано:
Цитата:
Каким наименьшим кол-вом квадратиков можно покрыть пол?
DiemonStar, уже дал ответ. Для усложнения решения, я бы сформулировал задачу так: Можно-ли выложить пол, размерами N на M, квадратиками, со стороной K, чтобы зазор между ними не превышал 1/10 K, со всех сторон? По моему, в таком виде, задачка выглядела-бы более привлекательно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.03.2013, 10:31   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вообще-то здесь просто нужна функция, округляющая по избытку. В математической библиотеке Паскаля такая может быть под названием Ceil.
В целых числах вместо
Код:
n div K + ord((n mod K) <> 0)
может быть записано
Код:
(n + K - 1) div K
А если у нас размеры заданы в числах вещественных, то вместо 1 следует
взять eps, где eps > 0 - малая величина. Ну и дополнить преобразованием типа
Код:
trunc((n + K - eps)/K)
Кстати, у eps может быть и физический смысл, например - максимально допустимая ширина щели.
s-andriano вне форума Ответить с цитированием
Старый 20.03.2013, 15:04   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Калия - это производная от какого слова?
Ранним утром, перед школой, после бессонной ночи и не такое напишешь
Цитата:
Вопрос возникает - можно ли эту плитку резать, чтоб замостить остальное? Или использовать только целые квадраты?
Только целые
Цитата:
думаю, что некоторые квадраты можно класть друг на друга "в нахлёст" (иначе задачу невозможно решить, например, для пола размером 5 x 5 и плиткой K=3
Именно

Цитата:
y := (n div k + (n mod k > 0)) * (m div k + (m mod k > 0));
Гениально!! Конечно же! Сначала берем целую далее добавляем!
Цитата:
Всё настолько просто, что мне кажется, что я чего-то не учёл!
Пойду от стыда тереть своё первоначально решение

Огромное спасибо!!
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрическая задача (C++) Day Stiff Фриланс 4 12.07.2012 12:50
геометрическая задача zaur.bat Паскаль, Turbo Pascal, PascalABC.NET 0 13.02.2012 19:39
С++. Геометрическая задача. student71 Помощь студентам 0 11.05.2011 01:28
Геометрическая задача С++ bloo[d] Общие вопросы C/C++ 9 30.01.2008 18:27