Делаю клон тральщика. Мой текущий алгоритм генерации мины таков: выбери координату, если на ней нет мины, поставь мину, иначе попробуй еще раз. Я думаю, что это неэффективный алгоритм, особенно на минных полях с высокой плотностью. Я рассматриваю некоторые другие варианты, такие как перетасовка Фишера-Йейтса и тому подобное, но я думаю, что у нее будет много времени для гораздо больших сеток. Я думаю об использовании связанных списков. Какие-либо предложения?
Алгоритм генерации мин тральщик
comment
поместите все возможные местоположения в список. перетасуйте список и положите бомбы в первые x мест.
- person Calum   schedule 06.03.2015
comment
Просто используйте перетасовку Фишера-Йейтса, чтобы рандомизировать индексы, а затем выберите количество мин от 0 до этого числа.
- person AD.Net   schedule 06.03.2015
comment
ох. Благодарность! попробую те. Но есть ли другие решения, которые могут сократить ненужную работу? Например, действительно ли мне нужно перетасовать ВЕСЬ список? В любом случае, я думаю, что буду придерживаться перетасовки, это проще и управляемее.
- person userx01   schedule 06.03.2015
comment
@ userx01 вам не нужно перемешивать весь список, вам просто нужно выбрать случайный индекс.
- person Pham Trung   schedule 06.03.2015
Ответы (1)
Если у вас есть список/массив, в котором вы можете получить размер списка за постоянное время, вы можете попробовать следующее:
list = List of all fields
N = number of mines
N.times do
index = random(list.size)
pick list[index]
list.remove(index)
end
Сюда:
- вам не нужно перетасовывать весь список
- вы избегаете выбора одних и тех же полей 2 раза
Короче говоря, это будет просто рисование случайного поля из списка и удаление его из списка, чтобы избежать столкновения при следующем розыгрыше.
person
dfens
schedule
06.03.2015
Да! Это то, что я ищу. Отличная помощь, спасибо! Кстати, можно ли этого добиться, используя только массивы? (для языков без структур данных)
- person userx01; 06.03.2015
Я думаю, что вы ищете скорее вектор, чем список. По умолчанию структура данных чистого списка не имеет метода size() с постоянным временем и метода remove().
- person dfens; 06.03.2015
Допустим, у меня есть массив 2d для минного поля. Затем я составлю еще один список и выберу X индексов, верно? Так что, по крайней мере, я копирую весь массив?
- person userx01; 07.03.2015