Программа которая возвращает минимальное количество прыжков - 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();
                
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы