IPB
ЛогинПароль:

> Сапер: теория и практика
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Здравствуйте wink.gif
В общем, пишу сапер на Паскале, исключительно сам (впрочем, до этого момента), "от нечего делать", с псевдографикой и без использования приемов ООП.
Возникли два вопроса совершенно разного рода.

1) На поле есть такая ситуация (создавал в Paint, правя другое расположение мин, так что если есть какие-то несоответствия - извиняйте. Отдельное извинение за качество, случайно сохранил в .джпг, что мог - то подправил. Ну и английский smile.gif ):
Прикрепленное изображение

Допустим, все клетки поля не раскрыты. После нажатия клетки, которая "в фокусе" (выделенная зеленым), как должны открыться клетки? У меня варианта три:
Прикрепленное изображение
Склоняюсь в верхнему справа, а что думаете вы?

2) Как можно гибко менять размеры окна (не в полноэкранном режиме)? Как я понял, с помощью процедуры TextMode гибкости не получить, я прав?

Спасибо wink.gif

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Clerick @ 8.10.2009 22:38) *
как генерируется поле?
Спасибо за вопрос, Clerick! Я как-то раньше не задумывался - плевал, пока не заплюю, с проверкой на повторы.. Но это же жутко неэффективно! Вот, задумался - результат тут:
const
n=10;

var
a: array[1..n]of integer;
i,k: integer;

begin
WriteLn('Total cells: n=',n);
Write('Type in number of cells to fill in (k<=n): k=');
ReadLn(k);
Randomize;
for i:=1 to n do if Random <= k/(n-i+1) then begin
a[i]:=1;
Dec(k)
end
else a[i]:=0;
for i:=1 to n do Write(a[i]);
ReadLn
end.

Алгоритм совсем простой - все заполняется за один проход )). И его легко распространить на двумерные массивы. Если что неясно - всегда к вашим услугам, как грится smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(Lapp @ 9.10.2009 4:16) *

Спасибо за вопрос, Clerick! Я как-то раньше не задумывался - плевал, пока не заплюю, с проверкой на повторы.. Но это же жутко неэффективно! Вот, задумался - результат тут...:

Есть такая статья, "Оптимизация – ваш злейший враг" http://www.rsdn.ru/article/philosophy/Optimization.xml
Там речь немного о другом, но заголовок идеально подходит к данному случаю.
В любом случае, если уж мы хотим оптимизировать, то должны сперва разобраться, а где же у нас узкое место.
В даном случае, очевидно, наиболее ресурсоемкой операцией является получение очередного ПСЧ. Да и весь цикл повторяется столько раз, сколько ячеек в поле.
По всей видимости, данный алгоритм должен заменить тот, в котором "метки" случайно набрасываются в поле с проверкой, не занята ли она уже.
Оцеки показывают, что количество проходов цикла и, соответственно, количество обращений к ДПСЧ будет меньше именно в исходном варианте при проценте заполнения не превосходящем примерно 60-67% (точно считать лень), т.е. алгоритм, предлагаемый как более эффективный, на самом деле имеет существенно меньшую эффективность. По краней мере, в большинстве случаев, когда процент заполнения менее упомянутых 60-67%. Если же процент заполнения больше, то задачу можно "перевернуть" и выбрасывать при помощи ДПСЧ "непомеченные" ячейки.
Таким образом, исходный алгоритм в слегка откорректированном виде будет ВСЕГДА эфективнее предложенного.

Пойдем дальше.
Можно ведт придумать алгоритм, в котором вызовов ДПСЧ будет РОВНО столько, сколько нужно помеченных клеток - и ни одной больше.
Навскидку могу предложить следующий (правда, не проверял его на качество распределения):
Нужно пометить K клеток из N, K < N.
1. В массиве заполняем первые K клеток, а остальные N-K оставляем пустыми.
2. Проходим циклом по первым K клеткам, для каждой находим случайное число в интервале [1..N] и обмениваем содержимое текущей [i] ячейки и ячейки с номером, соответствубщим выпавшему ПСЧ (для определенности - массив нумеруется с 1).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Vinchkovsky   Сапер: теория и практика   12.10.2008 19:09
TarasBer   Допустим, все клетки поля не раскрыты. После нажа…   13.10.2008 0:16
Vinchkovsky   Спасибо, действительно так, удалось подловить так…   13.10.2008 0:54
Clerick   Здравствуйте! У меня курсовая основывается на …   9.10.2009 2:38
Lapp   как генерируется поле?Спасибо за вопрос, Clerick…   9.10.2009 7:16
andriano   Спасибо за вопрос, [b]Clerick! Я как-то рань…   9.10.2009 11:27
Lapp   Да, согласен. И идея обращения тоже хороша. Но я …   9.10.2009 12:33
Clerick   Спасибо, Lapp! А существует ли какая-либо мате…   10.10.2009 23:37
Lapp   Спасибо, [b]Lapp! А существует ли какая-либо м…   11.10.2009 9:38
andriano   Уточнение: В первом приближении мродель реального …   11.10.2009 13:39
Clerick   И снова здравствуйте. Вопрос все по тому же саперу…   17.05.2010 0:34
Стаян   Помогите. Я тоже делаю сапер. И столкнулся с ледую…   24.12.2010 11:40
Lapp   Вообще, надо бы приводить хоть кусок кода. Хотя б…   24.12.2010 12:04
Стаян   у мени текстовый вариант сапера. Два символьных ма…   24.12.2010 12:48
Lapp   Спасибо!Пожалуйста   24.12.2010 16:08
volvo   Зациклить генерацию координат до тех пор, пока не …   24.12.2010 13:07
Стаян   да у меня там так и есть. Когда я пробывал делать …   24.12.2010 13:12
TarasBer   > Генерирую рандомом кооринаты, и некоторые коо…   24.12.2010 14:42
volvo   Череп не жмет? :dry: Потенциально (если бояться…   24.12.2010 16:02
TarasBer   > Череп не жмет? ОЛОЛО > Потенциально (есл…   24.12.2010 16:14
andriano   Думаю самый простой и достаточно эффективный алгор…   25.12.2010 2:43
Lapp   Думаю самый простой и достаточно эффективный алгор…   25.12.2010 8:19
-TarasBer-   1. Первое действие абсолютно излишне; ничто не ме…   25.12.2010 18:46
andriano   1. Первое действие абсолютно излишне; ничто не ме…   25.12.2010 20:01
Lapp   Насчёт излишнести 1 действия я не понял. Приведи к…   26.12.2010 9:59
Гость   Вот это круто. Просить меня привести код, в то в…   26.12.2010 17:31
-TarasBer-   Забыл имя вписать. Оказывается, отсутствие имени н…   26.12.2010 17:32


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 15:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name