Здравствуйте, nikov, Вы писали:
N>...Надо посчитать количество комнат в доме за минимальное количество проходов через двери.
Дык, ответ-то будет?
Например, это
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Ну, например, включаем свет в комнате 1, потом идём во виторую, третью, четвёртую... и везде свет гасим. E>Пусть мы последний раз встретили горящую лампочку в комнате номер К, и потом ещё К комнат не встречали. Тогда идём назад, в 1-ю и смотрим, горит ли там свет. Если горит, то возращаемся назад в 2*К и идём дальше, если нет, то всего есть К-1 комнат...
Мой алгоритм в общем случае лучше.
Ибо для твоего можно подобрать волшебную комбинацию когда он сделает больше шагов чем мой.
А мой не зависит от того в каком положении находятся выключатели.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, vb-develop, Вы писали:
VD>Минус за отсутствие описания алгоритма. Что за мода на форуме пошла? VD>Интересно общение в группе разработчиков тоже через исходники осуществляется?
Исходный код это ацки формализованный алгоритм.
Если ты не можешь прочиать простой код то как ты вобще работаешь?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Erop, Вы писали:
E>Ну, например, включаем свет в комнате 1, потом идём во виторую, третью, четвёртую... и везде свет гасим. E>Пусть мы последний раз встретили горящую лампочку в комнате номер К, и потом ещё К комнат не встречали. Тогда идём назад, в 1-ю и смотрим, горит ли там свет. Если горит, то возращаемся назад в 2*К и идём дальше, если нет, то всего есть К-1 комнат...
Если я тебя правильно понял то вот твой алгоритм вместе с генерацией одной из ацких комбинаций.
В данном случае он всегда хуже моего.
def test2(n)
{
def rooms = Rooms(n);
mutable j = 4;
for (mutable i = 0; i < n; ++i)
{
if (i == j)
{
rooms.Set(true);
j = j * j;
}
else
{
rooms.Set(false);
}
rooms.Next(1);
}
def loop(cur, last)
{
def last = if (rooms.Test()) cur else last;
rooms.Set(false);
if (last * 2 == cur)
{
rooms.Prev(cur - 1);
if (rooms.Test())
{
find(1);
}
else
{
(last - 1, cur)
}
}
else
{
rooms.Next(1);
loop(cur + 1, last);
}
}
and find(cur)
{
def cur = cur + 1;
rooms.Next(1);
if (rooms.Test())
{
rooms.Set(false);
loop(cur, cur);
}
else
{
find(cur);
}
}
rooms.Set(true);
def res = find(1);
(if (res[0] == n) 't'else'f', n, res, rooms.Steps);
}
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, vb-develop, Вы писали:
VD>>Минус за отсутствие описания алгоритма. Что за мода на форуме пошла? VD>>Интересно общение в группе разработчиков тоже через исходники осуществляется? WH>Исходный код это ацки формализованный алгоритм. WH>Если ты не можешь прочиать простой код то как ты вобще работаешь?
Я, например, не понял, что обозначают строчки лога. Скажем такая: (9, (9, 3, 8, b), 38)
Кроме того, там, где я работаю, принято писать комментарии...
Кстати, мне показалось, или твой алгоритм сразу же знает число комнат в доме?
В любом случае, интересно бы понять сколько дверей надо открыть для дома в N комнат, в худжем случае?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, vb-develop, Вы писали:
VD>Включим свет в той комнате, где мы находились (если он был выключен). Начинаем идти по кругу до тех пор пока не встретим комнату с включенным светом. Такая комната существует, т.к мы из неё вышли и нигде свет не выключали. Когда находим такую комнату выключаем свет, идем обратно в ту комнату, в которой мы включили свет. Разумеется эту комнату определяем по числу переходов между комнатами. Если в этой комната комнате свет окажется выключен, значит количество переходов между комнатами без единицы и есть количество комнат в доме. В противном случае повторяем итерацию до тех пор пока свет в исходной комнате не окажется выключен.
Можно проще. Начинаем ходить вправо-влево добавляя каждый раз на одну комнату к каждому направлению. Слева в каждой новой посещенной компате свет выключаем, справа — включаем. Как только приходим в комнату, в которой до этого свет включали/выключали, а он там выключен/включен — считаем длину последнего перемещения направо/налево. Сложность ~n^2.
Здравствуйте, nikov, Вы писали:
N>В здании есть N комнат. В каждой комнате есть две двери. Из комнаты номер 1 есть двери в комнаты 2 и N. Из комнаты номер N есть двери в комнаты (N-1) и 1. И любой другой комнаты с номером M есть двери в комнаты (M-1) и (M+1). То есть, комнаты расположены по кругу. Все комнаты одинаковы, и их номера на них не написаны. В каждой комнате есть выключатель, который включает/гасит свет в этой комнате. Из комнаты нельзя увидеть, горит ли свет в соседних команатах, если не зайти туда. В начале выключатели во всех комнатах находятся в произвольном положении, а вы находитесь в одной из комнат. В доме есть привидение, которое стирает любые отметки (например, надписи на стенах), но оно не может включать/гасить свет. Надо посчитать количество комнат в доме за минимальное количество проходов через двери.
1. Проходим в произвольно выбранном направлении X комнат, начиная с текущей. В первой попытке X = 2.
2. В каждой посещенной комнате изменяем состояние лампочки на противоположное и запоминаем(записываем) новое состояние лампочки.
3. Возвращаемся в исходную комнату и получаем количество лампочек Y, состояния которых не совпадают с записанными
(эти лампочки, если они есть, будут расположены подряд, поэтому не обязательно их считать, достаточно засечь порядковый номер последней).
4. Если Y == 0, то X <= N. В этом случае увеличиваем X в два раза (строго) и повторяем действия сначала.
5. Если Y != 0, то находим количество комнат по формуле: N = X - Y.
Принципиально, что X нужно увеличивать именно в 2 раза. Если увеличивать X больше, то могут возникнуть троекратные посещения одной комнаты при движении в одном направлении, что приведет к ошибке. Если меньше, чем в два, то не будет удовлетворено требование минимального количества проходов.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, vb-develop, Вы писали:
VD>>Минус за отсутствие описания алгоритма. Что за мода на форуме пошла? VD>>Интересно общение в группе разработчиков тоже через исходники осуществляется? WH>Исходный код это ацки формализованный алгоритм. WH>Если ты не можешь прочиать простой код то как ты вобще работаешь?
Извини, но то как я работаю к теме топика это не имеет ни малейшего отношения. И если что, то алгоритмы интересны не только программистам.
Здравствуйте, vb-develop, Вы писали:
VD>>>Минус за отсутствие описания алгоритма. Что за мода на форуме пошла? VD>>>Интересно общение в группе разработчиков тоже через исходники осуществляется? WH>>Исходный код это ацки формализованный алгоритм. WH>>Если ты не можешь прочиать простой код то как ты вобще работаешь? VD>Извини, но то как я работаю к теме топика это не имеет ни малейшего отношения. И если что, то алгоритмы интересны не только программистам.
После того как ты написал выделеное имеет.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Erop, Вы писали:
E>Я, например, не понял, что обозначают строчки лога. Скажем такая: (9, (9, 3, 8, b), 38)
А ты на что-то кроме них смотрел?
E>Кроме того, там, где я работаю, принято писать комментарии...
А что мне за это платят?
Тем более что если туда понаписать комментариев ничего нового не добавится.
E>Кстати, мне показалось, или твой алгоритм сразу же знает число комнат в доме?
Показалось.
E>В любом случае, интересно бы понять сколько дверей надо открыть для дома в N комнат, в худжем случае?
Последняя колонка лога.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>А что мне за это платят? WH>Тем более что если туда понаписать комментариев ничего нового не добавится.
Да ты можешь и вообще решений не предлагать, в принципе
E>>Кстати, мне показалось, или твой алгоритм сразу же знает число комнат в доме? WH>Показалось.
Ну там не совсем понятно где уже алгоритм, а где ещё генерилка
E>>В любом случае, интересно бы понять сколько дверей надо открыть для дома в N комнат, в худжем случае? WH>Последняя колонка лога.
Ну типа для 9 комнат 38 дверей? Тогда это довольно плохой результат...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, WolfHound, Вы писали:
WH>После того как ты написал выделеное имеет.
Мощно ты запрогался, однако
Даже алгоритм по-русски объяснить не можешь...
Да и хамить наверное лучше бы разучиться
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Мощно ты запрогался, однако E>Даже алгоритм по-русски объяснить не можешь...
А ты?
Мне пришлось не мало додумать чтобы реализовать твой алгоритм.
Ибо банальное переписывание твоего описания приводит к зацикливанию.
E>Да и хамить наверное лучше бы разучиться Re[2]: Количество комнат
Здравствуйте, Erop, Вы писали:
E>Ну типа для 9 комнат 38 дверей? Тогда это довольно плохой результат...
Сравни со своим.
колличество комнат, мой результат, твой результат(там еще над комбинацией поколдовать можно... еще хуже будет)
VD>>Включим свет в той комнате, где мы находились (если он был выключен). Начинаем идти по кругу до тех пор пока не встретим комнату с включенным светом. Такая комната существует, т.к мы из неё вышли и нигде свет не выключали. Когда находим такую комнату выключаем свет, идем обратно в ту комнату, в которой мы включили свет. Разумеется эту комнату определяем по числу переходов между комнатами. Если в этой комната комнате свет окажется выключен, значит количество переходов между комнатами без единицы и есть количество комнат в доме. В противном случае повторяем итерацию до тех пор пока свет в исходной комнате не окажется выключен. U>Можно проще. Начинаем ходить вправо-влево добавляя каждый раз на одну комнату к каждому направлению. Слева в каждой новой посещенной компате свет выключаем, справа — включаем. Как только приходим в комнату, в которой до этого свет включали/выключали, а он там выключен/включен — считаем длину последнего перемещения направо/налево. Сложность ~n^2.
Модификация:
ходим вправо-влево, но добавляем к направлению не одну комнату, а удваиваем "длину направления". Т.е. доходим до комнат: +1, -2, +4, -8, ... Соответственно, длина каждого прохода будет в 1,5 раза больше: 1, 3, 6, 12, ...
Сложность, вроде бы ~2n.
Возможно, выбирая коэффициент увеличения "длины направления", можно ещё улучшить результат. Думать лень, но на ум приходит число e как наиболее эффективное основание системы счисления.
Кстати, эта задачка напоминает проблему выделение памяти для растущего списка, когда будущий размер его даже примерно неизвестен.
Re: Количество комнат
От:
Аноним
Дата:
19.06.08 14:11
Оценка:
Здравствуйте, nikov, Вы писали:
N>В здании есть N комнат. В каждой комнате есть две двери. Из комнаты номер 1 есть двери в комнаты 2 и N. Из комнаты номер N есть двери в комнаты (N-1) и 1. И любой другой комнаты с номером M есть двери в комнаты (M-1) и (M+1). То есть, комнаты расположены по кругу. Все комнаты одинаковы, и их номера на них не написаны. В каждой комнате есть выключатель, который включает/гасит свет в этой комнате. Из комнаты нельзя увидеть, горит ли свет в соседних команатах, если не зайти туда. В начале выключатели во всех комнатах находятся в произвольном положении, а вы находитесь в одной из комнат. В доме есть привидение, которое стирает любые отметки (например, надписи на стенах), но оно не может включать/гасить свет. Надо посчитать количество комнат в доме за минимальное количество проходов через двери.
Идем вперед и запоминаем состояние лампочек. Каждые 2*n комнат проверяем, не повторяется ли состояние дважды: [1..n] и [n..2*n]. Если повторяется, меняем состояние в последней комнате и возвращаемся на n комнат назад. Если состояние в n-й комнате изменилось, число комнат равно n. Если нет, продолжаем в том же духе. Для 2 комнат худший случай -- 7 переходов, для 3 комнат -- 10, для 4 -- 17.
Здравствуйте, WolfHound, Вы писали:
WH>колличество комнат, мой результат, твой результат(там еще над комбинацией поколдовать можно... еще хуже будет) WH>
WH>1 2 7
WH>2 5 12
WH>
Что-то тут не так
1) По моему алгоритму при одной комнате в здании делаем так:
1.1) зажигаем свет в 1-й комнате
1.2) гасим во второй (1 дверь)
1.3) видим в третьей темноту (2-я дверь)
1.4) возвращаемся во вторую комнату (3-я дверь)
1.5) возвращаемся в первую комнату (4-я дверь) и видим что свет погас
Если предположить, что в комнате две комнаты, то мой алгоритм находит ответ за 8 дверей (что во второй не важно, если был свет, гасим, в третьей свет снова будет, потом пойдём ещё в четвёртую и в пятую и повернём назад)
Это что касается моего алгоритма.
Теперь давай посмотрим на твой. Какие двери и в каком порядке мы открываем, чтобы за две двери убедиться, что в здании только одна комната? Видимо идём во вторую комнату и возвращаемся в первую? А как тогда мы ещё за три двери убедимся, что комнат всего 2?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, WolfHound, Вы писали:
WH>>колличество комнат, мой результат, твой результат(там еще над комбинацией поколдовать можно... еще хуже будет) WH>>
WH>>1 2 7
WH>>2 5 12
WH>>
E>Теперь давай посмотрим на твой. Какие двери и в каком порядке мы открываем, чтобы за две двери убедиться, что в здании только одна комната? Видимо идём во вторую комнату и возвращаемся в первую? А как тогда мы ещё за три двери убедимся, что комнат всего 2?
Пойдем назад, изменим состояние лампочки, перейдем на две комнаты вперед, убедимся, что состояние изменилось и сделаем соответствующие выводы.
Получается такой алгоритм. Включаем свет в текущей комнате (=Left), идем вперед до ближайшей включенной (=Right), выключаем, возвращаемся (в Left). Если состояние не изменилось, идем назад до ближайшей выключенной (=Left), включаем, возвращаемся (в Right). Если ее состояние не изменилось... и так далее.
Число шагов в худшем случае равно N*(N+1)/2 + 1. Я подозреваю, что это наилучший результат из возможных. Но у уважаемого WolfHound'а результат лучше. Nemerle не владею, поэтому сказать, в чем тут дело, не могу.
Мир не просто сложнее, чем мы себе представляем, -- он сложнее, чем мы можем себе представить.