Программа которая возвращает минимальное количество прыжков - C#
Формулировка задачи:
Круг разбитый на 160 сегментов
Всего 16 секторов и 10 колец.
В дальнейшем каждый сегмент задается номером кольца (от 1 до 10 считая от центра) и номером сектора (от 1 до 16 по ходу часовой стрелки)
Например (1, 16) это сегмент, который расположен на первом кольце от центра и в 16 секторе.
На круге находится лягушка возвращена по ходу часовой стрелки.
Лягушка может прыгнуть в 5 точек относительно своего первоначального положения:
● на том же кольце на 3 сектора вперед
● на 1 кольцо ближе к центру и на 2 сектора вперед
● на 1 кольцо дальше от центра и на 2 сектора вперед
● на 2 кольца ближе к центру и на 1 сектор вперед
● на 2 кольца дальше от центра и на 1 сектор вперед
Лягушка не может выпрыгнуть за круг, не может развернуться, и не может прыгать через
центр.
Лягушка не может прыгать на сегменты, которые заняты деревьями (на рисунке (9, 14) и (8, 5))
Задание:
Напишите программу, которая возвращает минимальное количество прыжков, что необходимо сделать
лягушке для того, чтобы добраться из начального сегмента в конечном.
Входные параметры: начальный и конечный сегменты, количество деревьев, координаты
сегментов занятых деревьями.
В выводе программы необходимо отметить минимальное количество и минимальный путь, или
сообщение о невозможностью добраться из исходного положения в конечное.
Решение задачи: «Программа которая возвращает минимальное количество прыжков»
textual
Листинг программы
static class Program { /// <summary> /// Прыжок /// </summary> /// <param name="сircle"></param> /// <param name="x">Номер сектора откуда прыгаем</param> /// <param name="y">Номер кольца откуда прыгаем</param> /// <param name="dx">На сколько секторов прыгаем</param> /// <param name="dy">На сколько колец прыгаем</param> static void rec(int[,] circle, int x, int y, int dx=0, int dy=0) { // Сколько уже прыжков совершили int n = circle[x, y]; // Новые координаты: x = (x + dx) % 16; y += dy; // завершаем рекурсию: if (y < 0 || y >= 10 // Если прыгнули за круг или центр || circle[x, y] == -1 // Если в новых координатах стоит дерево || circle[x, y] > 0 && circle[x, y] < n) // Если уже был найден более коротнкий путь return; // Говорим, что в новые координаты можно добрать за n+1 прыжков circle[x, y] = n + 1; // Запускаем рекурсию по всем возможным направлениям: rec(circle, x, y, 3, 0); rec(circle, x, y, 1, -2); rec(circle, x, y, 1, 2); rec(circle, x, y, 2, 1); rec(circle, x, y, 2, -1); } static void Main() { // Круг (заполнен нулями) int[,] circle = new int[16, 10]; // Устанавливаем деревья: circle[5-1, 8-1] = -1; circle[14-1, 9-1] = -1; // Начнем с точки 11,7 rec(circle, 11 - 1, 7 - 1); // Теперь для каждого сегмента круга мы // знаем сколько прыжков нужно, чтобы туда добраться // Например, Console.WriteLine("в сегмент (3,3) мы доберемся за:" + (circle[3 - 1, 3 - 1] - 1) + " прыжков"); // В общем случае: Console.Write(" "); for (int x = 0; x < 16; x++) Console.Write("[{0,2}] ", x+1); Console.WriteLine(); for (int y = 0; y < 10; y++) { Console.Write("[{0,2}] ", y+1); for (int x = 0; x < 16; x++) Console.Write("{0,4} ", circle[x, y] - 1); Console.WriteLine(); } Console.ReadLine(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д