powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Головоломка "Миссия невыполнима"
12 сообщений из 12, страница 1 из 1
Головоломка "Миссия невыполнима"
    #36906179
Фотография arhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Досталась в наследство головоломка, представляющая из себя коробку под куб размером 5x5x5 и набор брусков - 1х2х4 - 6 шт, 2х2х3 - 6 шт, 1х1х1 - 5 шт. К сожалению досталась уже в разобранном виде, и человека, обладающего секретом решения найти не удалось :)

Собрать головоломку так и не удалось - пробовали сами, давали всем знакомым, прошел месяц, а куб так никто и не собрал :) Удалось лишь найти свидетелей, утверждающих, что видели головоломку собранной - это внушает надежду :)

Поиск решения по Интернету результатов не дал - половина ссылок на магазины с головоломкой, другая половина на отзывы по типу:

купила ее в январе,пробовали собрать все:родня,друзья,коллеги,соседи - результат ноль,неужели все такие глупые...отличная головоломка.
отличная штука,год уже собрать не можем.
Я сам заманался блин!!! Где схема!
Это головоломка не для детей! Не может собрать никто из знакомых уже месяц. Инструкции нет. Сейчас сяду писать программу для полного перебора вариантов...

И вот даже трогательная история из ЖЖ

Так вот, возникла идея все же написать программу по перебору всех вариантов и поиску решения головоломки, но начинать с нуля не хочется - может кто-то чем-то похожим занимался? Какие есть мысли на тему?
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36906184
Фотография arhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылка на магазин с головоломкой - внешний вид: тынц

И занимательная история для тех, у кого залочен ЖЖ :)

Некто Рыжий (nekto_r)Такая история.
Прихожу я как-то к людям (со мной такое иногда случается). А у этих людей есть странное увлечение - увлечены они настольными играми и головоломками всех мастей. Уникуб, пексесо, маджонг, настольные игры... Прихожу я к ним, значит, и встречают меня радостными возгласами: мол, славабогутыпришоооооооооооол, щасвсёбудетхорошооооооооооо, ты-то нам и нужен, садись скроее! И пододвигают ко мне кучку деревяшек.
- Чо это? - интеллигентно так интересуюсь я.
Выясняется: это есть очередная головоломка. Все эти деревяшки - 6 плашек 1х2х4, 6 брусков 2х2х3 и 5 кубиков 1х1х1 - надо сложить в коробку, в которой они продавались. В итоге должен получиться куб 5х5х5.
- И почему это должен делать я?
- Ну... ты понимаешь... мы ее купили, сын все сразу из коробки вытряхнул, и теперь мы не можем ее сложить обратно. Три дня сидим.
Муж, Жена и Сын по очереди пыхтят над этой херней. Один устанет, отпихнет ее, скажет: "Да дрянь вообще какая-то, надоела она мне!" - другой садится. Всех гостей заставляют собирать. В интернет уже слазили - решение искали. В интернете вычитали, что эту хрень называют "Миссия невыполнима", что, понятное дело, только прибавило им энтузиазма...
Ну, и я тоже попытался. Складываешь-складываешь, все ок, до последнего ряда доходишь - бл*, напильничка не хватает: если вот эту штуку распилить вот так и так, все очень хорошо уложится. А без напильничка - фиг.
После двадцатой попытки я спросил: "А оно точно было нормально уложено?" После двадцать пятой сказал: "Да идите вы в жопу со своими головоломками!" После тридцатой... после тридцатой предложил прийти в тот магазин и заявить: "Вы нам продали бракованную головоломку, поменяйте пжалста на нормальную, в упаковке".
- Ага, - мрачно сказал Муж. - А она ответит: "Да где ж бракованная? Вот, смотрите, прекрасно собирается!" - и сложит как надо. Вот позору-то будет...
- Если сложит, тогда надо хватать и бежать, - рассудил я. - А дома посмотреть сначала, как оно уложено. Сфотографировать со всех сторон. Выучить. И только потом - разбирать! А лучше не трогать больше...

К чему это я: сегодня снова туда ходил.
Народу там перебывало - несчитано.
До сих пор не сложили.
Два месяца прошло.
Вроде кто-то из математиков и программистов даже переписал все размеры и решил составить программку, чтобы она посчитала, как это дело укладывается. Но пока о результатах ничего не слышно.
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36906695
_пит_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
arhi
Так вот, возникла идея все же написать программу по перебору всех вариантов и поиску решения головоломки, но начинать с нуля не хочется - может кто-то чем-то похожим занимался? Какие есть мысли на тему?
пиши на пайтоне,
а то щас опять холивар начнёться, что c++ для этого неудобен

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36908018
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно без программы, просто нарисовать решение ? :) Каждый блок - своим цветом, послойно.
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36908026
Фотография arhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер!!
Спасибо большое :))
Упаковали куб и больше обещаем его не разбирать :))
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36908103
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такой штуки нет, я по вашему описанию смотрел. Сначала пытался на бумажке нарисовать, потом попробовал программу написать. Получилось плохо - из-за какого-то бага при проверке пересечений программа выдала неправильное решение. Но понял я это, только когда начал это решение зарисовывать. Однако, посмотрев на то, что получилось, увидел как можно картинку поправить. А в программе баг так и не нашел :)
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912297
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone Получилось плохо - из-за какого-то бага при проверке пересечений программа выдала неправильное решение.
Я программу составил, и вроде как работает на более простых примерах, однако для настоящего случая компютер не выходит на решение. При анализе ситуации оказывается, что фигура 1 характеризуется 5 параметрами - ориентация (3), поворот (2), и три координаты (от 2 до 5). При упрощенном подсчете получаем 3х2х2х4х5 = 240 вариантов расположения.
Положение второй фигуры определяется 4 параметрами - ориентация (3), и три координаты (от 3 до 4). Получаем количество вариантов 3 х 3 х 4 х 4 = 144 варианта.
Поскольку 6 фигур одного и другого типа, всего получаем
240 6 * 144 6 = 34560 6 = около 10 27 .
Если предположить, что компьютер имеет частоту 1 Ггц и обрабатывает за 1000 тактов один вариант, то получаем 10 6 вариантов в секунду, или нам потребуется 10 21 секунд для полного перебора. Если предположить, что в сутках 10 5 секунд, то потребуется 10 16 суток. На компьютере миссия действительно невыполнима.
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912375
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vowk, нет, ерунда у вас какая-то получилась. Я багу у себя уже нашел. Полный перебор за несколько минут делается. Всего 8 вариантов укладки - все получаются из уже приведенного выше зеркальными отражениями и поворотами. (Кстати, бага была при выводе координат фигуры 1х2х4, а просчитывалось все правильно - так что решение все-таки программа нашла, после отрисовки всех 2x2x3 правильно дорисовать 1х2х4 было несложно).
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912408
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneVowk, нет, ерунда у вас какая-то получилась. Я багу у себя уже нашел. Полный перебор за несколько минут делается. Всего 8 вариантов укладки - все получаются из уже приведенного выше зеркальными отражениями и поворотами. (Кстати, бага была при выводе координат фигуры 1х2х4, а просчитывалось все правильно - так что решение все-таки программа нашла, после отрисовки всех 2x2x3 правильно дорисовать 1х2х4 было несложно).
А в студию программу можно?
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912437
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да она в плохом стиле написана, и под этот конкретный случай - обругают ведь :) А править что-то уже лениво.
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912443
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <utility>

struct blk {
  bool pt[ 5 ][ 5 ][ 5 ];
  int x1, x2, y1, y2, z1, z2;
  blk (int x1, int x2, int y1, int y2, int z1, int z2) {
    this->x1 = x1;  
    this->x2 = x2;  
    this->y1 = y1;  
    this->y2 = y2;  
    this->z1 = z1;  
    this->z2 = z2;  
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          pt[i][j][k] = (i>=x1 && i<=x2 && j>=y1 && j<=y2 && k>=z1 && k<=z2);
  }

  blk (const blk &rt) {
    this->x1 = rt.x1;  
    this->x2 = rt.x2;  
    this->y1 = rt.y1;  
    this->y2 = rt.y2;  
    this->z1 = rt.z1;  
    this->z2 = rt.z2;  
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          pt[i][j][k] = rt.pt[i][j][k];
  }

  blk (void) {
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          pt[i][j][k] = false;
  }

  bool intersect (const blk &rt) {
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          if (pt[i][j][k] && rt.pt[i][j][k]) return true;
    return false;
  }

  void unite (const blk &rt) {
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          pt[i][j][k] = pt[i][j][k] || rt.pt[i][j][k];

  }

  void diff (const blk &rt) {
    int i,j,k;
    for (i= 0 ;i< 5 ;++i)
      for (j= 0 ;j< 5 ;++j)
        for (k= 0 ;k< 5 ;++k)
          pt[i][j][k] = pt[i][j][k] && !rt.pt[i][j][k];
  
  }
};

void gen(std::vector<blk> &v, int a, int b, int c) {
  int i,j,k;
  for (i= 0 ;i+a<= 5 ;++i)
    for (j= 0 ;j+b<= 5 ;++j)
      for (k= 0 ;k+c<= 5 ;++k)
        v.push_back(blk(i,i+a- 1 ,j,j+b- 1 ,k,k+c- 1 ));
}

bool find_next(blk &t,const std::vector<blk> &v,int p[ 6 ]) {
 int a,b,c,d,e,f;
 for(a=p[ 0 ];a<v.size()- 5 ;p[ 1 ]=++a+ 1 ,p[ 2 ]=p[ 1 ]+ 1 ,p[ 3 ]=p[ 2 ]+ 1 ,p[ 4 ]=p[ 3 ]+ 1 ,p[ 5 ]=p[ 4 ]+ 1 ) {
  t = v[a];
  for(b=p[ 1 ];b<v.size()- 4 ;p[ 2 ]=++b+ 1 ,p[ 3 ]=p[ 2 ]+ 1 ,p[ 4 ]=p[ 3 ]+ 1 ,p[ 5 ]=p[ 4 ]+ 1 ) {
   if (t.intersect(v)) continue;
   t.unite(v[b]);
   for(c=p[ [b]2 ];c<v.size()- 3 ;p[ 3 ]=++c+ 1 ,p[ 4 ]=p[ 3 ]+ 1 ,p[ 5 ]=p[ 4 ]+ 1 ) {
    if (t.intersect(v[c])) continue;
    t.unite(v[c]);
    for(d=p[ 3 ];d<v.size()- 2 ;p[ 4 ]=++d+ 1 ,p[ 5 ]=p[ 4 ]+ 1 ) {
     if (t.intersect(v[d])) continue;
     t.unite(v[d]);
     for(e=p[ 4 ];e<v.size()- 1 ;p[ 5 ]=++e+ 1 ) {
      if (t.intersect(v[e])) continue;
      t.unite(v[e]);
      for(f=p[ 5 ];f<v.size();++f) {
       if (t.intersect(v[f])) continue;
        t.unite(v[f]);
        p[ 0 ]=a;p[ 1 ]=b;p[ 2 ]=c;p[ 3 ]=d;p[ 4 ]=e;p[ 5 ]=f;
        return true;
      }
      t.diff(v[e]);
     }
     t.diff(v[d]);
    }
    t.diff(v[c]);
   }
   t.diff(v);
  }
 }
 return false;
}

bool try_push(blk &t,const std::vector<blk> &w,int p[ [b]6 ]) {
 int a,b,c,d,e,f;
 std::vector<std::pair<int,blk> > v;
 for (int i= 0 ;i<w.size();++i)
  if (!t.intersect(w[i])) v.push_back(std::make_pair(i,w[i]));
 if (v.size()< 6 ) return false;
 for(a= 0 ;a<v.size()- 5 ;++a) {
  if (t.intersect(v[a].second)) continue;
  t.unite(v[a].second);
  for(b=a+ 1 ;b<v.size()- 4 ;++b) {
   if (t.intersect(v.second)) continue;
   t.unite(v[b].second);
   for(c=b+ [b]1 ;c<v.size()- 3 ;++c) {
    if (t.intersect(v[c].second)) continue;
    t.unite(v[c].second);
    for(d=c+ 1 ;d<v.size()- 2 ;++d) {
     if (t.intersect(v[d].second)) continue;
     t.unite(v[d].second);
     for(e=d+ 1 ;e<v.size()- 1 ;++e) {
      if (t.intersect(v[e].second)) continue;
      t.unite(v[e].second);
      for(f=e+ 1 ;f<v.size();++f) {
       if (t.intersect(v[f].second)) continue;
//        t.unite(v[f].second);
        p[ 0 ]=v[a].first;p[ 1 ]=v.first;p[ [b]2 ]=v[c].first;p[ 3 ]=v[d].first;p[ 4 ]=v[e].first;p[ 5 ]=v[f].first;
        return true;
      }
      t.diff(v[e].second);
     }
     t.diff(v[d].second);
    }
    t.diff(v[c].second);
   }
   t.diff(v.second);
  }
  t.diff(v[a].second);
 }
 return false;
}


int main() {
  int p[ [b]6 ]={ 0 , 1 , 2 , 3 , 4 , 5 },q[ 6 ];

  std::vector<blk> v;
  gen(v, 2 , 2 , 3 );
  gen(v, 2 , 3 , 2 );
  gen(v, 3 , 2 , 2 );
  std::cout << v.size() << '\n';

  std::vector<blk> w;
  gen(w, 1 , 2 , 4 );
  gen(w, 1 , 4 , 2 );
  gen(w, 2 , 1 , 4 );
  gen(w, 2 , 4 , 1 );
  gen(w, 4 , 1 , 2 );
  gen(w, 4 , 2 , 1 );
  std::cout << w.size() << '\n';

//  std::random_shuffle(w.begin(),w.end());
//  std::random_shuffle(v.begin(),v.end());

  blk t;

  while(find_next(t,v,p)){
    if (try_push(t,w,q)) {
      int i;
      std::cout << "Success\n";
      for(i= 0 ;i< 6 ;++i)
        std::cout << v[p[i]].x1+ 1  << '-' << v[p[i]].x2+ 1  << ',' << v[p[i]].y1+ 1  << '-' << v[p[i]].y2+ 1  << ',' << v[p[i]].z1+ 1  << '-' << v[p[i]].z2+ 1  << '\n';
      std::cout << '\n';
      for(i= 0 ;i< 6 ;++i)
        std::cout << w[q[i]].x1+ 1  << '-' << w[q[i]].x2+ 1  << ',' << w[q[i]].y1+ 1  << '-' << w[q[i]].y2+ 1  << ',' << w[q[i]].z1+ 1  << '-' << w[q[i]].z2+ 1  << '\n';
      std::cout << '\n';
    }
    ++p[ 5 ];
  }
  std::cout << "Finished\n";
}
...
Рейтинг: 0 / 0
Головоломка "Миссия невыполнима"
    #36912459
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,
спасибо проанлизирую. Я в Excelе составил, но поскольку она не выдает решения, то вряд ли представляет интерес.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Головоломка "Миссия невыполнима"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]