- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
Procedure TForm1.CreateObjects(Column, Row: Integer); // Процедура создания кнопок (ячеек).
Var
i, j, iLeft, iTop, iRow : Integer; // Переменные, отвечающие за расположение ячеек на форме. (Кроме iRow, она содержит номер ячейки по горизонтали.)
SpeedButton : array of TSpeedButton; // Собственно, сам массив с ячейками.
cColumn : Char; // Номер ячейки по вертикали.
iMine : ShortInt; // Дополнительная переменная кол-ва бомб на поле.
BEGIN
{Присваиваем начальные значения переменным. :7:}
iLeft := 0; // Начальная позиция по горизонтали.
iTop := 5; // Начальная позиция по вертикали.
iRow := 1; // Номер ячейки по горизонтали.
iMine := MineCount; // Кол-во мин на поле.
cColumn := 'A'; // Номер ячейки по вертикали.
SetLength(SpeedButton, Row+1); // Массив с ячейками.
{------------------------------------------ :7:}
{Создаём новые списки. :8:}
FObjectList := TObjectList.Create; // Список с объектами.
Form2.FMineList := TStringList.Create(); // Список с номерами мин на поле.
{--------------------- :8:}
{Главный цикл создания игрового поля :9:}
For i := 1 to Column do // Запускаем цикл создания по вертикали.
Begin
For j:=1 to Row do // Теперь тоже самое по горизонтали.
bEgin
SpeedButton[j] := TSpeedButton.Create(Self); // Создаём очередную ячейку на поле.
SpeedButton[j].Parent := GamePanel; // Этим параметром указываем, что ячейка принадлежит первой форме.
SpeedButton[j].Top := iTop; // Задаём расположение ячейки по вертикали.
SpeedButton[j].Name := cColumn + IntToStr(iRow); // Задаём имя ячейки.
SpeedButton[j].Flat := True; // Используем св-во кнопок не отображаться на рисунке.
SpeedButton[j].Font.Color := clBlue; // Делаем цвет текста синим.
SpeedButton[j].Font.Style := [fsBold]; // Делаем шрифт жирным.
SpeedButton[j].OnClick := SpeedButton1.OnClick; // Указываем, какая процедура будет вызываться при клике на ячейку.
SpeedButton[j].OnMouseDown := SpeedButton1.OnMouseDown; // Указываем, какая процедура будет вызываться при нажатии на ячейку.
SpeedButton[j].Left := iLeft+8; // Задаём расположение ячейки по горизонтали, смещая её на 8 пикселей вправо.
{Устанавливаем бомбу в ячейку. :10:}
If (iMine <> 0) and (SpeedButton[j].Name <> 'A1') then // Если кол-во бомб не превышено, то...
beGin
Randomize; // Генерируем список ПСЧ.
SpeedButton[j].Tag := Random(2); // Случайным образом задаём, будет ли бомба находится в ячейке.
If SpeedButton[j].Tag = 1 then
begin
Form2.FMineList.Add(SpeedButton[j].Name); // Добавляем новую запись в массив бомб.
Dec(iMine); // Уменьшаем счетчик мин на единицу.
end;
enD;
{----------------------------- :10:}
FObjectList.Add(SpeedButton[j]);// Добавляем новую запись в массив ячеек.
iLeft := iLeft + 24; //Увеличиваем расстояние между ячейками.
If iRow = Row then iRow := 1 // Если номер следующей ячейки по горизонтали неправильный, то меняем его на 1.
Else Inc(iRow); // Иначе увеличиваем номер.
eNd;
cColumn := Char(Ord(cColumn) + 1); // Увеличиваем номер ячейки по вертикали.
iTop := iTop + 24; // Увеличиваем положение ячейки по вертикали.
iLeft := 0; // Обнуляем позицию ячейки по горизонтали.
End;
{----------------------------------- :9:}
ImageList1.GetBitmap(0, (FindComponent('A1') as TSpeedButton).Glyph); // Загружаем спрайт в первую ячейку.
Form2.FMineList.SaveToFile('OUTPUT.TXT'); // Сохраняем расположение мин в файл.
MineCountLabel.Caption := IntToStr(Form2.FMineList.Count); // Показываем колво мин на поле.
END;
Function TForm1.CheckMove(X,Y : ShortString): Boolean; // Функция проверки валидности ячейки. Она должна находится рядом с текущей.
Var
iXod, iAlf : Integer; // Вспомогательные переменные.
BEGIN
result := false; // Презумпция вины :)
iXod := Abs(StrToInt(Y) - StrToInt(dPos.yInt)); // Получаем расстояние до текущей ячейки по горизонтали.
iAlf := Abs(Ord(dPos.xChr) - Ord(X[1])); // Получаем расстояние до текущей ячейки по вертикали.
If ((iXod <= 1) and (iAlf <= 1)) and ((iXod <> 0) or (iAlf <> 0)) then result := true; // И если оно не больше одного, то разрешаем ход.
END;
Procedure TForm1.SpeedButton1Click(Sender: TObject); // Главная процедура нажатия на кнопку(ячейку).
Var
i : Integer; // Счётчик цикла.
cObject : TSpeedButton; // Сам объект.
Str, j : String; // Вспомогательная переменная имени ячейки.
Count : Integer; // Вспомогательная переменная. (стр. 160)
BEGIN
{Подготавливаем переменные :1:}
cObject := TSpeedButton(Sender); // Получаем ячейку, на которую кликнули.
Str := cObject.Name; // Присваиваем вспомогательной переменной имя задействованной ячейки.
dClick.xAlf := Str[1]; // Присваиваем переменной первый символ задействованной ячейки по вертикали.
dClick.yFlt := Copy(Str, 2, Length(Str)); // Получаем номер ячейки по горизонтали.
{------------------------- :1:}
...
По просьбам желающих. Код некогда созданной мною игрушки Сапёр. Отдельный прикол, это как потом все эти кнопки удаляются.
TarasB 12.11.2012 20:28 # 0
Govnocoder#0xFF 12.11.2012 20:36 # +1
6PAT 12.11.2012 20:49 # +4
Govnocoder#0xFF 12.11.2012 21:01 # 0
bormand 12.11.2012 21:03 # +7
3.14159265 13.11.2012 11:32 # +4
http://www.youtube.com/watch?v=xos2MnVxe-c
bormand 12.11.2012 20:39 # +1
Блин, я думал что они вручную аккуратно разложены на форме... Цикл создания кнопок уменьшает градус говнокодности данного говокода :(
> Randomize
А вот Randomize перед каждым random'ом это то еще говнецо... Особенно если ГПСЧ инициализируется временем с точностью до мс...
Govnocoder#0xFF 12.11.2012 20:40 # 0
3.14159265 12.11.2012 20:47 # +1
bEgin~eNd //м-м даже так.
Вообще очень настроженно отношусь к коду в котором каждая строка раскомментирована. Но тут ничего смертельного. Так, мелочи.
Совсем не такое говно как рекламировали.
bormand 12.11.2012 20:49 # 0
Govnocoder#0xFF 12.11.2012 21:05 # +1
Alf сокращено от Alfavit. То есть координата клетки по вертикали. Flt координата по горизонтали. Это дополнительные значения координат.
bormand 12.11.2012 21:10 # 0
Резонно.
> Flt координата по горизонтали.
А можно английское слово, от которого это порождено?
Govnocoder#0xFF 12.11.2012 21:23 # +1
Govnocoder#0xFF 12.11.2012 20:49 # 0
3.14159265 12.11.2012 20:52 # 0
>X,Y : ShortString
Зачем координаты строками?
>iLeft := iLeft + 24
>SpeedButton[j].Left := iLeft+8;
Я такое в своё время тоже писал. Сейчас бы наверное вынес 8 в константу и танцевал от неё.
Помню в VB была херь TwipsPerPixel или как-то так. В дельфях тоже должно быть такое, 8 - это ж не пиксели? Вот от неё бы и мерял.
Govnocoder#0xFF 12.11.2012 20:58 # 0
Сейчас уже не вспомню почему выбрал строки вместо чисел. Наверное, тогда мне показалось что так "компактней". Думаете есть смысл переписать под числа?
С меджик намберами тоже всё понятно.
3.14159265 12.11.2012 21:02 # 0
Я бы не стал. Работает - не трогай.
Тупая работа вроде этой не принесет пользы.
Govnocoder#0xFF 12.11.2012 21:10 # 0
PascalGovno 12.11.2012 21:30 # 0
Govnocoder#0xFF 12.11.2012 21:33 # 0
PascalGovno 13.11.2012 09:08 # 0
Майкрософтовская системная венгерка жжот, кстати.
bormand 12.11.2012 21:34 # +3
Govnocoder#0xFF 12.11.2012 21:40 # +1
bormand 12.11.2012 20:55 # 0
Govnocoder#0xFF 12.11.2012 21:02 # +1
bormand 12.11.2012 21:03 # 0
P.S. И интересно бы узнать что означают alf и flt?
Govnocoder#0xFF 12.11.2012 21:08 # +1
bormand 12.11.2012 21:11 # +4
А можно грабитьминировать корованы?
Govnocoder#0xFF 12.11.2012 21:12 # +1
3.14159265 12.11.2012 21:14 # +3
А то в коде говна я не вижу.
bormand 12.11.2012 21:29 # +1
P.S. Присоединяюсь к предыдущему оратору с просьбой выложить куда-нибудь прогу.
eth0 12.11.2012 22:02 # +2
bormand 12.11.2012 20:47 # 0
Сапёр с сейвами это читерство!
Govnocoder#0xFF 12.11.2012 20:58 # 0
TarasB 12.11.2012 21:52 # +1
tirinox 12.11.2012 21:12 # −7
3.14159265 12.11.2012 21:19 # +3
Govnocoder#0xFF 12.11.2012 21:20 # +5
Fai 12.11.2012 21:58 # 0
Лучше вообще без комментариев, чем с такими.
Govnocoder#0xFF 12.11.2012 22:05 # +2
Fai 12.11.2012 22:06 # +1
Nemoden 13.11.2012 05:36 # +1
Govnocoder#0xFF 13.11.2012 19:49 # +2
TarasB 13.11.2012 11:34 # +3
PascalGovno 13.11.2012 11:54 # 0
TarasB 13.11.2012 17:48 # +1
Govnocoder#0xFF 13.11.2012 19:26 # 0
TarasB 13.11.2012 19:27 # +3
for i := 1 to 10 do
swap(i, random(i+1,100));
LispGovno 14.11.2012 07:18 # −2
LispGovno 14.11.2012 07:22 # 0
bormand 14.11.2012 08:50 # +1
LispGovno 14.11.2012 09:28 # −2
LispGovno 14.11.2012 07:20 # −1
TarasB 14.11.2012 09:33 # +1
Учи матан, гумно.
TarasB 14.11.2012 09:36 # 0
for i := 1 to 10 do
swap(i, random(i,100));
то есть клетку можно поменять с самой собой.
Иначе не сойдётся даже количество различных выхлопов ГСЧ за n итераций, будет (n-1)*(n-2)*...*(n-k)=C(n-1,k-1). А надо C(n,k)
Нет, это не C(n,k). Короче, если все мины разные, то число их расположений будет n*(n-1)*...(n-k+1)=n!/(n-k)! . И алгоритм мой тоже имеет столько же выходов в зависимости от результатов ГСЧ.
Чтобы доказать равномерность, надо доказать, что для каждого расположения мин существует выход алгоритма, дающий это расположение
TarasB 14.11.2012 09:41 # +2
TarasB 14.11.2012 09:49 # +3
Переход:
берём любое расположение k мин на поле из n клеток. Берём выход алгоритма k-1 мины для поля из n-1 клеток, который даёт нужное распложение для мин с номерами 2,3,4...k, такой выход существует по индукционному предположению.
Смотрим, какая клетка после данной перестановки переставилась туда, куда мы хотим поставить мину 1.
Тогда берём, ставим мину 1 на место этой клетки, делаем перестановку для (k-1) на (n-1), получаем нужную перестановку
чтд
LispGovno 14.11.2012 09:54 # −2
TarasB 14.11.2012 10:07 # +2
LispGovno 14.11.2012 10:18 # −2
TarasB 14.11.2012 10:26 # +2
LispGovno 14.11.2012 11:12 # −2
TarasB 14.11.2012 11:15 # +2
LispGovno 14.11.2012 09:53 # −2
TarasB 14.11.2012 10:06 # +2
Govnocoder#0xFF 16.11.2012 20:14 # −1
> random(i,100)
С каких пор рандом принимает несколько аргументов? Или ты свою ф-ю писал? У меня не компилится короче.
Govnocoder#0xFF 16.11.2012 20:25 # −1
TarasB 16.11.2012 20:42 # +1
Если бы я написал Random(cell_count-i+1)+i, то что, было бы понятнее?
Govnocoder#0xFF 16.11.2012 21:03 # −1
1. Кидаем в первые N клеток бомбы (единицы):
2. Проходимся по всему массиву и каждый элемент меняем местами с другим случайным элементом:
TarasB 16.11.2012 21:11 # +1
Как можно быть таким невнимательным
Govnocoder#0xFF 16.11.2012 21:22 # 0
TarasB 16.11.2012 21:53 # +1
Кстати, это всё для случая нумерации от 1, ну ты понял. Так паскальнее ^^
> High(MineArray)
> LengthOfArray
Ты определись
Govnocoder#0xFF 16.11.2012 21:59 # −1
Использую переменную, вызывать лишний раз функцию ни к чему.
> случая нумерации от 1
А если юзать i := 0, какие подводные камни?
TarasB 16.11.2012 22:33 # 0
У тебя фигня в алгоритме же. В двух местах, в которых должна быть одна и та же сущность, я вижу разные вещи.
Что за High(), она же только для динмассива возвращает число используемых элементов. А в динмассиве с нуля начинается.
> А если юзать i := 0, какие подводные камни
Нумерацию сдвинуть трудно?
Так, сколько тебе лет, каков твой стаж?
Govnocoder#0xFF 17.11.2012 09:48 # −1
> она же только для динмассива
MineArray у меня динамический массив.
В общем, спасибо. Всё работает как надо.
> Так, сколько тебе лет, каков твой стаж?
Нискажу.
TarasB 17.11.2012 13:10 # +1
И при этом ты так спокойно пошёл писать алгоритм, явно предназначенный для нумерации от 1?!
Govnocoder#0xFF 17.11.2012 13:19 # −1
TarasB 17.11.2012 13:43 # +1
Ладно, подскажу, как вообще правильно надо действовать для любых индексов начала и конца:
Govnocoder#0xFF 17.11.2012 13:45 # 0
TarasB 17.11.2012 13:57 # 0
2. Почему LengthOfArray хранит не длину, а верхний индекс? Назови нормально. LastIndex типа там.
Логика цикла перестановок правильная.
И ещё, я раньше тоже индексировал массивы от 0 до Length-1, а потом Ада меня отучила от этого.
Govnocoder#0xFF 17.11.2012 14:13 # −1
Я тут заметил кое-что. Если использовать 1й вариант SwapEx (как в моём коде выше), то кол-во мин будет каждый раз варьироваться от 17 до 20. А если переписать:
то всё норм. Почему так?
TarasB 17.11.2012 14:16 # +2
Вот есть у тебя код
a:=a-b;
b:=a+b;
a:=b-a;
а теперь представь, что a и b являются ссылками на один и тот же адрес. После первой же строки они обе обнуляются.
Про индексы аналогично.
Про xor вместо +- аналогично.
guest 17.11.2012 19:47 # 0
вы оба занимаетесь преждевременной оптимизацией
да еще и на паскале
TarasB 17.11.2012 19:48 # 0
guest 17.11.2012 20:18 # +2
TarasB 17.11.2012 20:26 # +1
guest 17.11.2012 20:36 # 0
TarasB 17.11.2012 20:59 # +1
guest 17.11.2012 21:09 # −1
TarasB 17.11.2012 21:16 # 0
guest 17.11.2012 21:36 # −1
guest 17.11.2012 22:39 # −2
bormand 17.11.2012 15:40 # −1
> Потому что ты пиздец
Два чаю этому сэру.
TarasB 17.11.2012 16:29 # 0
guest 17.11.2012 16:33 # +2
bormand 17.11.2012 16:37 # 0
Речь идет о сферическом ньюфаге в вакууме.
P.S. А что это, если не форум?
Vasiliy 20.11.2012 11:55 # +1
Govnocoder#0xFF 14.11.2012 22:45 # 0
> Кидаешь в первый 10 клеток
Куда конкретно кидать?
Fai 13.11.2012 20:55 # 0
2. Если мин больше чем нужно - удаляешь случайную.
3. Если ровно столько сколько нужно - выходишь из цикла.
4. В противном случае переходишь на шаг 2.
Плюс алгоритма в простоте и том, что для входных данных только одно условие - число мин должно быть неотрицательным числом.
Govnocoder#0xFF 13.11.2012 21:09 # 0
А как правильно брать случайные числа? Тут выше говорили что Randomize преде Random`ом говно.
bormand 13.11.2012 21:18 # +2
TarasB 13.11.2012 21:52 # −2
bormand 13.11.2012 21:52 # +4
LispGovno 13.11.2012 21:55 # +1
TarasB 14.11.2012 10:09 # −1
bormand 13.11.2012 21:59 # +2
Fai 14.11.2012 04:58 # +1
Random сам по себе говно, ищи вихрь мерсена, а то как же играть в сапёра, без равномерного распределения мин?
LispGovno 14.11.2012 07:17 # 0
А вот твистер из крестов с локальным состоянием в объекте или рандом в Хаскеле - норм
bormand 14.11.2012 08:52 # 0
Не стоит подозревать. Там какой-нибудь тупейший конгруэнтный генератор в духе: Если есть желание - загляни в исходники делфевого RTL, благо они открыты.
LispGovno 14.11.2012 09:27 # 0
TarasB 14.11.2012 09:30 # −3
TarasB 14.11.2012 09:30 # +2
То, что ты сказал, выдаст период длины max
bormand 14.11.2012 11:27 # +1
TarasB 14.11.2012 11:31 # −1
bormand 14.11.2012 12:05 # 0
И к тому же я забыл, как правильно преобразовывают генератор чисел от 0 до N в генератор от 0 до M ;(
Помню, что что-то типа буферной переменной, из которой делением извлекаются случайные числа нужного размера, а когда битов остается мало - в нее набиваются новые, взятые из генератора.
TarasB 14.11.2012 13:17 # 0
Не поверишь
Seed*M/N
В Паскале именно так и делается, так как там N=2^32, то делается mul, потому возвращается содержимое edx.
В сишке возвращаются старшие 16 бит сида, поэтому rand()%n не зацикливается слишком быстро.
bormand 14.11.2012 13:34 # 0
Ну да, согласен, для конгруэнтного говногенератора такой способ более чем адекватен.
Но распределение получается чуть-чуть перекошенным. Если N не делится на M, то некоторые числа выпадают немного чаще остальных.
Портить хорошие генераторы типа вихря мерсена таким преобразованием нехорошо, поэтому я и пытался вспомнить как это делается с равномерным распределением (см. статью ниже).
TarasB 14.11.2012 13:36 # +1
bormand 14.11.2012 14:06 # +2
bormand 14.11.2012 15:10 # +2
bormand 14.11.2012 12:16 # +1
http://mathforum.org/library/drmath/view/65653.html
PascalGovno 14.11.2012 16:46 # 0
The method does work, but... с какого для тасования колоды карт перестало хватать линейного конгруэнтного PNRG mod RANGE_MAX + RANGE_MIN?
roman-kashitsyn 14.11.2012 16:51 # +4
Сначала прочитал как тарасования колоды
PascalGovno 14.11.2012 17:00 # 0
http://govnokod.ru/12107#comment160588
bormand 14.11.2012 19:16 # +1
С того дня как всякие онлайн казино должны проходить сертификацию на труъ рандомность. Вот и приходится покупать аппаратные источники труъ рандома, и использовать такие методы...
PascalGovno 14.11.2012 20:02 # 0
ждем некогда созданную мною игрушку Сапёр онлайн, с мультиплеем и на бабки
eth0 14.11.2012 21:33 # 0
Вроде как можно собрать самому даже. Нужен только АЦП, шумящий диод и контроллер. Для серьёзных применений не годится, конечно.
Кроме того, можно насолить впрок. Получил сорок гигабайт чистой энтропии и выбирай себе. Главное - не попадаться с этим правоохренителям на глаза.
bormand 14.11.2012 21:47 # +1
Ну если надо было бы проходить сертификацию - я бы все-таки купил готовый.
P.S. Хотел одно время спаять такой генератор на стабилитроне - ни один стабилитрон шуметь не захотел ;(
bormand 14.11.2012 21:14 # +2
Здесь как раз описан частный случай алгоритма, который приводил выше Тарас (ка пример правильного алгоритма). А так же описаны последствия хренового тасования: Авторы рассказывают, что написали программу, которая рассчитывала полный расклад, увидев первые пять карт, за одну секунду. А для покера это само собой эпик фейл.
PascalGovno 15.11.2012 22:17 # 0
Если их исправить, то рассказ в конце станет невероятным, т.к. нет реальной возможности узнать сколько было в LSB таймера на момент старта и сколько раундов RNG выполнилось до начала анализа.
bormand 15.11.2012 22:38 # +2
На самом деле даже если пофиксить те баги, и оставить стандартный конгруэнтный PRNG, то проблема останется.
Перед началом алгоритма сид может находится в одном из 2^32 состояний, а
4млрд вариантов это не такое уж большое число. Это намного меньше, чем 52!.
Да, в точности угадать расклад уже не удастся. Если мы играем колодой из 52 карт, то 5 карт попадут нам на руки одним из 311875200 способов. Поделим 2^32 на это число, и получим в районе 14 раскладов. Для ускорения вычислений можно составить таблицу, пусть она и будет весить гигабайты, зато поиск будет мгновенным.
Итого - посмотрев на полученные карты, и не зная начального состояния генератора, мы получаем примерно 14 вариантов расклада. А это очень неплохой чит для такой игры как покер.
TarasB 13.11.2012 21:11 # +2
LispGovno 13.11.2012 22:42 # +3
Я куплю тебе калач.
Если будешь плакать -
Куплю худой лапоть!
Fai 14.11.2012 04:59 # 0
TarasB 14.11.2012 09:32 # 0
У тебя быдлоалгоритм, он тормозит, он долго пишется.
Мой алгоритм быстро работает, быстро пишется, даёт идеальное распределение, но чтобы это понять, нужен матан.
Это как сортировка перебором и квиксорт.
TarasB 14.11.2012 10:09 # 0
Это всё равно что удалять плохие элементы из массива по одному (со сдвигом хвоста), потому что это просто и понятно. А на просьбу сделать нормально (через проход с двумя итераторами) говорить, что это сложно и нарушает КИСС.
Я так понимаю, у быдлокодеров появился новый флаг?
Раньше они писали говно, потому что "Дейкстра сказал не оптимизировать", теперь они пишут говно, потому что "в Википедии написано не усложнять".
Какую идиому не придумай, а быдлокодер её всё равно в качестве отмазки применит.
Fai 14.11.2012 19:16 # 0
Нейтрализовал.
> У тебя быдлоалгоритм, он тормозит, он долго пишется.
Может быть. Я предложил свою версию, почему ты в меня какашками кидаешься не знаю.
> Мой алгоритм быстро работает, быстро пишется
Да, я посмотрел твой алгоритм, действительно задумка хорошая. И он даже проще.
P.S. А людей незнакомых с ходу быдлокодерами называть перестань..
P.P.S. По-поводу "квадратичности" твой алгоритм отрабатывает n операций, где n - необходимое количество мин, а мой - (m-n), где n - количество мин, а m - площадь поля.
Таким образом, если нужно разместить 90 мин на поле в 100 клеток, мой алгоритм будет быстрее.
А если необходимо раместить 1 мину на поле в 1000 клеток - тут твой лидер.
TarasB 14.11.2012 19:56 # 0
Расскажи, как ты делаешь операцию "убрать случайную мину".
> P.S. А людей незнакомых с ходу быдлокодерами называть перестань..
Я тебя быдлокодером не называл, я сказал только, что у тебя быдлоалгоритм, и что быдлокодеры любую идиому применят в качестве оправдания своему быдлокоду.
bormand 14.11.2012 20:20 # +1
Ну например так:
1. Заводим дополнительный массив, в который в начале алгоритма помещаем координаты всех мин;
2. Генерируем случайное число, используем его как индекс в массиве, получаем координаты мины которую надо удалить;
3. Берем последний элемент массива и переставляем его на место только что поюзанного;
4. ???
5. Удаление мин за О(1) при O(n) памяти, PROFIT
TarasB 14.11.2012 20:30 # 0
Govnocoder#0xFF 14.11.2012 22:51 # 0
Т.е. сначала массив будет полностью забит единицами (бомбами), или как? И такой массив у меня уже есть, ничего заводить не надо.
TarasB 14.11.2012 22:57 # 0
bormand 14.11.2012 23:10 # 0
bormand 14.11.2012 23:04 # 0
http://govnokod.ru/12107#comment160674
> Куда конкретно кидать?
Хм. Очень странный вопрос. Как-нибудь нумеруете все клетки поля по порядку. В первые K клеток помещаете мины...
P.S. А если все-таки хочется поюзать алгоритм Fai - его лучше немного перевернуть:
1. Инициализируем само поле нулями, а дополнительный массив координатами всех клеток:
2. Для каждой мины
2.1. Генерируем случайное число rnd в диапазоне 1 . .freecnt (например 3)
2.2. free[rnd] покажет координаты клетки, в данном случае (2,1), помещаем в нее мину:
field = {{0, 0}, {1, 0}}
2.3. Переставляем free[freecnt] на место free[rnd], уменьшаем freecnt на единицу
P.P.S. Код приводить не буду из образовательных целей.
Govnocoder#0xFF 14.11.2012 23:12 # 0
LispGovno 14.11.2012 07:12 # 0
Зависть плохое чувство.
И алгоритм Fai не квадратичный (но n в О(n) побольше).
TarasB 14.11.2012 09:33 # 0
Расскажи мне про эту часть подробнее.
> 3. Если ровно столько сколько нужно - выходишь из цикла.
> цикла
LispGovno 14.11.2012 09:51 # 0
http://ideone.com/dWAorT
PascalGovno 15.11.2012 22:00 # 0
> Плюс алгоритма
Плюс в том, что оригинальный баг починен и мины теперь кучкуются с другого края :-)