C# генерация случайного пути

176
02 января 2019, 16:20

У меня есть двумерный массив целых чисел. В данном массиве есть точка входа [0,0] , а так же точка выхода [Length-1,Length-1]. (Это квадрат, матрица, если можно так назвать).
Мне нужно сгенерировать случайный путь с точки входа в точку выхода и заполнить этот путь числом 98. (Прошу заметить, не самый короткий, а просто случайный). Подкиньте идею, как реализовать.

Answer 1

Если нет никаких ограничений на то, в какой мере путь может пересекать или накладываться на себя, случайный путь - это просто набор случайных точек. Напишем код для заполнения линии между двумя точками:

public class Map
{
    int[,] cells;
    public Map(int size)
    {
        cells = new int[size, size];                
    }
    //заполнение прямой между двумя точками заданным числом
    public void FillLine(int x1, int y1, int x2, int y2, int value)
    {
        int x = x1, y = y1;
        int dx = Math.Sign(x2 - x1); //приращение по X
        int dy = Math.Sign(y2 - y1); //приращение по Y
        bool direction_y = false;
        while (true)
        {
            cells[x, y] = value;                    
            if (x == x2 && y == y2) break; //достигнута конечная точка
            //сделаем по очереди приращение по X или Y
            if (direction_y)
            {
                if (y != y2) y += dy;
            }
            else
            {
                if (x != x2) x += dx;
            }
            direction_y = !direction_y;
        }
    }
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder(500);
        for (int y = 0; y < cells.GetLength(0); y++)
        {
            for (int x = 0; x < cells.GetLength(0); x++)
            {
                sb.AppendFormat("{0} ",cells[x,y].ToString().PadLeft(2));
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

Тогда заполнение случайного пути будет выглядеть так:

const int SIZE = 30; 
const int N = 4; 
Map m = new Map(SIZE);
Random rnd = new Random();            
int x0=0,y0=0,x, y;
int value = 1;
//проходим через N случайных точек
for (int i = 0; i < N; i++)
{
    x = rnd.Next(SIZE-1);
    y = rnd.Next(SIZE-1);
    m.FillLine(x0, y0, x, y,value);
    x0 = x;
    y0 = y;
}
//заходим в конец
x = SIZE - 1;
y = SIZE - 1;
m.FillLine(x0, y0, x, y, value);
READ ALSO
Стрелка на кривой Безье

Стрелка на кривой Безье

Подскажите, как можно нарисовать в конце кривой Безье стрелку? Есть множество примеров как это сделать для прямой линии (1 , 2 , 3), но именно...

178
С# поиск bytes в большом файле и замена

С# поиск bytes в большом файле и замена

Надо поменять в 4 местах hex значение в большом файле 6 gb Использую этот код

175
Как создать анимацию в Unity

Как создать анимацию в Unity

Подскажите, как запустить анимацию пушки во время выстрела ядра из нее? Создание и выстрел ядра у меня происходит в методе Shoot()Не понимаю...

219
Цикл по переменным

Цикл по переменным

Что есть:

178