Top.Mail.Ru
Ответы

Как завершить работу рекурсии в с#?. Проблема в том, что при выходе из лабиринта ошибка "выход за пределы массива".

Using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Example_1
{
class Program
{
static int labx = 0, laby = 0;
static bool isWorking = true;

static int[,] labyrint =
{
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, 00, 00, 00, 00, 00, 00, 00, 00, -1},
{-1, 00, -1, 00, -1, 00, -1, -1, 00, -1},
{-1, 00, -1, 00, -1, 00, -1, -1, 00, -1},
{-1, 00, -1, 00, -1, 00, 00, 00, 00, 00},
{-1, 00, -1, 00, -1, 00, -1, -1, -1, -1},
{-1, 00, -1, 00, -1, 00, -1, 00, 00, -1},
{-1, 00, -1, 00, -1, 00, -1, 00, 00, -1},
{00, 00, 00, 00, 00, 00, 00, 00, 00, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
};

// Вывод лабиринта
static void DrouwLabyrint()
{
for (int i = 0; i < labyrint.GetLength(0); i++)
{
for (int j = 0; j < labyrint.GetLength(1); j++)
{
Console.SetCursorPosition(labx + j * 2, laby + i);
if (labyrint[i, j] == 0)
{
Console.Write(" "); // пустое пространство
}
else if (labyrint[i, j] == -1)
{
Console.Write("██"); // 219 стены
}
else
{
Console.Write("{0:d2}", labyrint[i, j]); // хлебные крошки
}
}
}
}

// Рекурсивная функция поиска выхода
static bool NextStep(int x, int y, int step)
{
if (x == labyrint.GetLength(0) - 1)
{
return false;
}
else
{
// Пишем цифру
labyrint[y, x] = step;
DrouwLabyrint(); Console.ReadKey(true);

if (labyrint[y, x + 1] == 0 )
{
// Вправо
NextStep(x + 1, y, step + 1);
}
if (labyrint[y - 1, x] == 0)
{
// Смотрим вверх
NextStep(x, y - 1, step + 1);
}
if (labyrint[y, x - 1] == 0)
{
// Смотрим влево
NextStep(x - 1, y, step + 1);
}
if (labyrint[y + 1, x] == 0)
{
// Смотрим вниз
NextStep(x, y + 1, step + 1);
}
// если мы в тупике делаем откат
labyrint[y, x] = 0;
// визуализация
DrouwLabyrint(); Console.ReadKey(true);
return true;
}

}

static void Main(string[] args)
{

while(isWorking)
{
isWorking = NextStep(0, 8 , 1);
}

Console.WriteLine("Задача решена!");
Console.WriteLine("Координаты выхода: ");

Console.ReadLine();
}
}
}

По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект

что-то я не понимаю:
где задаются координаты выхода,
что символизирует значение, возвращаемое NextStep-ом,
и почему мы всегда в конце концов делаем откат?