Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Любой язык легкая задача

Фермеру подарили трех кроликов интересной породы. Они должны жить все вместе в одном загоне, но у каждого должен быть при этом свой угол. У фермера есть 20 заборных секций по 1 метру каждая. Фермер хочет использовать их все, не резать и не изгибать. Таким образом должен получиться треугольный вольер с периметром 20 метров, каждая сторона которого составляет целое число метров.
Чтобы выбрать подходящий вольер, фермер хочет иметь список всех возможных различных таких треугольников с целыми сторонами и с суммой сторон равной 20.
Треугольник задаётся длинами своих сторон в порядке их обхода по часовой стрелке, начиная с любой стороны (из курса геометрии известно, что треугольники равны, если равны длины соответствующих сторон). То есть, например, тройки чисел
4 6 9
и
6 9 4
задают один и тот же треугольник, а тройки
4 6 9
и
6 4 9
задают разные треугольники, потому что их невозможно так совместить друг с другом, чтобы соответствующие стороны были равны.

В ответе необходимо вывести в отдельных строках тройки чисел - длины сторон треугольников (в метрах), удовлетворяющих условию. Стороны каждого треугольника выводятся в любом порядке. Сами треугольники также перечисляются в произвольном порядке. Все треугольники должны быть попарно различными (то есть не должно быть повторяющихся треугольников).
Например, ниже приведено описание некоторых трёх треугольников в описанном формате (не относящихся к условию задачи):
5 3 3
9 10 2
2 3 4
В зависимости от количества различных вариантов треугольников решения могут получить от 0 до 100 баллов. Если в решении присутствует тройка чисел, не являющаяся длинами последовательных сторон треугольника, решение оценивается в 0 баллов. Если в ответе присутствует треугольник, не отвечающий условию задачи, оно оценивается в 0 баллов. Если в решении какой-либо треугольник перечислен хотя бы дважды, балл за решение будет снижен.

По дате
По рейтингу
Аватар пользователя
Новичок
12345
 for (int i = 1; i <= 20 / 3; ++i) {
  for (int j = i; 2 * j <= 20 - i; ++j) {
    cout << i << ' ' << j << ' ' << 20 - i - j << '\n';
  }
} 

Идея та же, что и в соседнем ответе, но проверка на существование треугольника не требуется: все перебираемые варианты уже являются заведомо существующими треугольниками.

12
 for i in range(1, 20 // 3 + 1):
  for j in range(i, (20 - i) // 2 + 1): print(i, j, 20 - i - j) 
Аватар пользователя
Искусственный Интеллект
123456789101112131415
 import Data.List 
 
-- Функция для проверки, является ли тройка чисел сторонами треугольника 
isTriangle :: Integral a => a -> a -> a -> Bool 
isTriangle a b c = a + b > c && a + c > b && b + c > a 
 
-- Функция для генерации всех возможных треугольников с суммой сторон равной total 
generateTriangles :: Integral a => a -> [[a]] 
generateTriangles total = nub [sort [a, b, total - a - b] | a <- [1..total `div` 3], b <- [a..(total - a) `div` 2], isTriangle a b (total - a - b)] 
 
main :: IO () 
main = do 
    let triangles = generateTriangles 20 
    mapM_ print triangles