![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Perfez |
![]() ![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
Важно:Сразу прошу вас не пишите готовую программу ,а только объясните сам алгоритм в кратце:
![]() ![]() Лич Сандро проводит свои научные исследования в магии огня. Сандро стоит в центре огромного квадратного зала площадью 1000000 квадратных километров, сплошь замощённого квадратными каменными плитами со стороной один метр. По взмаху посоха вокруг Сандро возникает огненный круг радиуса R метров. Центр круга совпадает с центром зала и находится в месте соприкосновения 4-х плит. Сандро хочет посчитать, сколько плит будет испорчено огнем. Считается, что плита испорчена, если она имеет хотя бы две общие точки с кругом. На рисунке в качестве примера изображены плиты, испорченные огненным кругом радиуса 4: Исходные данные В единственной строке записано целое число R > 0 — радиус огненного круга. R не превосходит 10^5. Результат Выведите целое число — количество испорченных плит. Примеры: 2-16 4-60 ![]() Сообщение отредактировано: Perfez - 5.03.2007 16:45 Эскизы прикрепленных изображений ![]() |
![]() ![]() |
Чужак |
![]()
Сообщение
#2
|
![]() меркантильный ![]() ![]() ![]() Группа: Пользователи Сообщений: 161 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, промежуточное /графическое/ решение может выглять
примерно так...
Затем пальцем по экрану-считать /шутка ![]() Сделать то же, но не графически, а через формулы площадей... (Кстати, напоминает задачу геометров 16в/кажется/ о квадратуре круга- как построить круг,с помощью циркуля,карандаша и линейки, по площади равный данному квадрату со стороной N./Задача о квадратуре круга с пом.циркуля, кар. и линейки не решается/) -------------------- Смысл откроется тебе. Красками играя
Жизнь предстанет как поток без конца и края. В этом мире порой разбиваютсямечты Но чтобы он стал другой Вдруг в него приходишь ТЫ... После странствий и скитаний настают другие времена. Старая волна уходит и приходит новая волна. |
Lapp |
![]()
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Нужно пройтись по квадратам, проверяя, есть ли у них точки, находящиеся на расстоянии меньше R от центра. При этом можно учесть следующее..
Во-первых, достаточно пройтись по одному квадранту - например, x>0, y>0 - а потом домножить результат на 4. По-хорошему, нужно было и квдрант поделить биссектрисой пополам, но это немного усложнит алгоритм (поскольку пришлось бы отдельно учитывать квадраты, лежащие на биссектрисе).. Во-вторых, достаточно ограничится проверкой квадратов, которые лежат на расстоянии не более R от центра по каждой координате. В третьих, достаточно проверять только одну точку каждого квадрата - а именно, левый нижний угол (если квадрант выбран, как сказано выше). Таким образом, получаем двойной цикл (по x и по y) от 0 до R. Расстояние вычисляем по теореме Пифагора. Соотношение для проверки получается следующее: Sqrt(x^2+y^2)<R Но, учитывая, что квадратный корень может дать некоторую ошибку, я бы предпочел проверять сами квадраты: x*x + y*y < R*R Если это условие выполнено - круг испорчен, если нет - замена плитки не требуется.. ![]() Обрати внимание на строгое неравенство в условии! При нестрогом выполнении, может произойти "касание" в одной точке, что (по условию гарантии ![]() Не забудь полученное число умножить на 4 (либо првести циклы от -R до R) 2 Чужак: Эта задача не имеет никакого отношения к квадратуре круга. Кстати, КК гораздо древнее XVI века - она занимала еще древних греков, насколько мне известно.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Perfez |
![]() ![]()
Сообщение
#4
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
огромное спасибо,Lapp.
![]() ![]() ![]() вот сам pas файл: ![]() что делать?посоветуй что-нибудь может обратиться к первому алгоритму-пифагора? ![]() ![]() |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
посоветуй что-нибудь Я же сказал: используй вторую форму! с квадратами.. Она должна работать быстрее. При этом вычисли R^2 заранее. Добавлено через 1 мин. Кроме того, не вижу у тебя обнуления z перед циклом. Добавлено через 2 мин. То есть с перемножениями, извини. Хотя, скорее всего это все равно.. Но вынос R*R за оба цикла должен сработать. А вычисление x*x можно вынести за внутренний цикл, во внешний. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Perfez |
![]() ![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
может ещё что-нибудь посоветуешь?
![]() ![]() ![]() |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Сходил по ссылке, глянул. Ситуация серьезная..
![]() Нужно менять алгоритм полностью. Например, так.. 1. Обнуляем z (счетчик плиток). 2. Обнуляем y 3. В х кладем R (координаты) 4. Делаем условный цикл: пока x^2+y^2>R^2 , уменьшаем х на 1 (если x<0 - выходим) 5. Увеличиваем z на x 6. Увеличиваем y на 1 7. Если y>R - выходим. 8. Переходим к 5 Это будет обход по контуру круга, начиная справа-снизу квадранта (четверти круга). Плитку суммируем горизонтальными полосами. Заметь, что у снова можно возводить в квадрат вне цикла. Через минут 10-15.. Исправляю два пункта: 4 и 7 Сообщение отредактировано: Lapp - 28.02.2007 14:31 -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата может ещё что-нибудь посоветуешь? А можно мне?Смотри, что ты делаешь: For x:=0 to r doБерем бубен, и ... For x:=0 to r do ... а время выполнения - экономит... |
Perfez |
![]() ![]()
Сообщение
#9
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
|
Perfez |
![]()
Сообщение
#10
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#11
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
3. В х кладем R (координаты) - Обьясни пожалуйста,как понять? ![]() Очень просто: x:=R Слово в скобках означает, что нововведенные переменные y и x - это координаты (типа пояснение) ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Perfez |
![]()
Сообщение
#12
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
1. Обнуляем z (счетчик плиток). 2. Обнуляем y 3. В х кладем R (координаты) 4. Делаем условный цикл: пока x^2+y^2>R^2 , уменьшаем х на 1 (если x<0 - выходим) 5. Увеличиваем z на x 6. Увеличиваем y на 1 7. Если y>R - выходим. 8. Переходим к 5 Все эти 8 пунктов в цикле или я не понимаю обнуление на что? ![]() |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Perfez, что-то там очень странное с тестами... Я пробовал делать так:
Цитата(Lapp) 4. Делаем условный цикл: пока x^2+y^2>R^2 , уменьшаем х на 1 (если x<0 - выходим) заменил на5. Увеличиваем z на x Цитата 4. Устанавливаем X в [sqrt(R2 - Y2)] Далее по алгоритму Lapp-а, программа летает, только проходит 9 тестов как положено, на 10-м выдает неправильный результат, хотя должно работать... Ничего не понимаю...4а. Условный цикл: пока x2+y2<R2 увеличиваем X на 1 ... 5. Увеличиваем z на x |
Lapp |
![]()
Сообщение
#14
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Все эти 8 пунктов в цикле или я не понимаю обнуление на что? ![]() Это полный алгоритм. Обнуление - это значит "присвоить ноль". Пишу фрагмент программы (примерно) z:=0; По ходу обнаружил ошибку - в п.8 переход не на 5, а на 4. Трудно уследить за нумерацией в такой записи.. Надеюсь, ты отслеживаешь смысл ![]() Добавлено через 4 мин. Выитание R^2-y^2 вне цикла - очень здравая идея ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Perfez |
![]()
Сообщение
#15
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата Разве в Паскале,z автоматически не обнуляется? Я бы не стал на это надеяться... Лучше сделать самому, чем потом искать ошибку, которой нет...Кстати, то, что я написал выше я поправил - проблема была только в том, что по умолчанию Sqrt работает с Double, а мне надо было Extended... Доп. переменная решила проблему - все тесты пройдены... |
Perfez |
![]() ![]()
Сообщение
#17
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
Так,так...ну не понимаю я это алгоритм...
![]() Цитата 6. Увеличиваем y на 1 Цитата for y=R downto 0 begin Ну нельзя же изменять значение у в цикле,разве я не прав? |
Lapp |
![]()
Сообщение
#18
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Так,так...ну не понимаю я это алгоритм... ![]() Ну нельзя же изменять значение у в цикле,разве я не прав? Нельзя, верно. Но и не надо! ![]() Я просто перенес изменение у в сам цикл. Погоди, сейчас я нарисую картинку. Тогда поймешь.. Заходи минут через 15 -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
![]()
Сообщение
#19
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Как обычно - снова обнаружил у себя ошибку.. Алгоритм правильный, ошибка в фрагменте кода. Почему-то я цикл по y перевернул - странно.. Цикл должен быть от 0 до R, конечно.
Вот, смотри, наглядно на рисунке. Начинаем справа внизу. Красные стрелки - цикл по y, зеленые - внутренний цикл с уменьшением x. Желтые клетки - те на которых останавливается внутренний цикл. Голубые - те, которые он проходит. Суммируем те клетки, что слева от желтых (включая их тоже). ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Perfez |
![]() ![]()
Сообщение
#20
|
![]() Бывалый ![]() ![]() ![]() Группа: Модераторы Сообщений: 231 Пол: Женский Репутация: ![]() ![]() ![]() |
Я наконец-таки понял алгоритм
![]() ![]() ![]() если да то он выводит неправильный результат... ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 18:13 |