2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Задача о семи конях
Сообщение19.11.2014, 01:37 
Аватара пользователя


01/12/11

8634
В оригинале задача звучит так:

Расставьте на шахматной доске 7 коней так, чтобы любая белая клетка находилась под боем хотя бы одного коня.

Я немного её переформулирую и спрошу, сколько существует таких расстановок.

Вот, к примеру, моя:

Изображение

А вот авторская:

Изображение

Как нетрудно заметить, они резко отличаются.

А вот сколько их всего?

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение19.11.2014, 17:30 
Заслуженный участник


18/01/12
933
Ручным перебором у меня получилось, что есть только 4 (если не различать симметричные — то 2) требуемых позиции. (Поля a8 и h1 должны быть атакованы двумя конями. Остальные 5 коней атакуют 6 полей: a2, b1, b7, g2, g8 и h7. Следовательно есть конь либо на c3 либо на f6. И т.д.)
Хотелось бы, чтобы кто-нибудь проверил это на компьютере.

(Оффтоп)

В авторском решении неточность: у шахматной доски поле a1 чёрное :-) .

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение20.11.2014, 00:10 
Аватара пользователя


01/12/11

8634
hippie
Спасибо!
Насчёт проверки на компьютере обращаюсь к уважаемым программистам, кому не лень.
А правило "light on right" (поле в правом нижнем углу (то есть h1) - белое), по всей видимости, ускользнуло от внимания автора задачи. В моей расстановке, кстати, оно намеренно соблюдено.

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение20.11.2014, 10:53 
Заслуженный участник


04/03/09
910
Проверил на компе. С учетом симметричных - две. К сожалению, я не могу видеть картинок с радикала, так что предположу, что они совпадают с теми, что в первом посте. Этакие "квадрат без угла" и "самолет".
Без учета симметрий 4.

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение21.11.2014, 00:06 
Аватара пользователя


01/12/11

8634
12d3
Спасибо!
А хотя бы кусочек кода не покажете?

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение21.11.2014, 11:04 
Заслуженный участник


04/03/09
910
Он ужасен и мне стыдно его показывать, но раз просите..
Код:
#include <iostream>
using namespace std;
int main() {
   int count = 0;
   for (int i1=0;i1<32;i1++) {
      int x1,y1;
      if (i1 % 8 < 4)
         x1 = (i1%4)*2;
      else
         x1 = (i1%4)*2 + 1;
      y1 = i1/4;
      for (int i2=i1+1;i2<32;i2++) {
         int x2,y2;
         if (i2 % 8 < 4)
            x2 = (i2%4)*2;
         else
            x2 = (i2%4)*2 + 1;
         y2 = i2/4;
         for (int i3=i2+1;i3<32;i3++) {
            int x3,y3;
            if (i3 % 8 < 4)
               x3 = (i3%4)*2;
            else
               x3 = (i3%4)*2 + 1;
            y3 = i3/4;
            for (int i4=i3+1;i4<32;i4++) {
               int x4,y4;
               if (i4 % 8 < 4)
                  x4 = (i4%4)*2;
               else
                  x4 = (i4%4)*2 + 1;
               y4 = i4/4;
               for (int i5=i4+1;i5<32;i5++) {
                  int x5,y5;
                  if (i5 % 8 < 4)
                     x5 = (i5%4)*2;
                  else
                     x5 = (i5%4)*2 + 1;
                  y5 = i5/4;
                  for (int i6=i5+1;i6<32;i6++) {
                     int x6,y6;
                     if (i6 % 8 < 4)
                        x6 = (i6%4)*2;
                     else
                        x6 = (i6%4)*2 + 1;
                     y6 = i6/4;
                     for (int i7=i6+1;i7<32;i7++) {
                        int x7,y7;
                        if (i7 % 8 < 4)
                           x7 = (i7%4)*2;
                        else
                           x7 = (i7%4)*2 + 1;
                        y7 = i7/4;
                        count++;
                        int arr[8][8];
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              arr[i][j] = 0;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x1 == 2 || x1-i == 2) && (j-y1 == 1 || y1-j==1) || (i-x1 == 1 || x1-i == 1) && (j-y1 == 2 || y1-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x2 == 2 || x2-i == 2) && (j-y2 == 1 || y2-j==1) || (i-x2 == 1 || x2-i == 1) && (j-y2 == 2 || y2-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x3 == 2 || x3-i == 2) && (j-y3 == 1 || y3-j==1) || (i-x3 == 1 || x3-i == 1) && (j-y3 == 2 || y3-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x4 == 2 || x4-i == 2) && (j-y4 == 1 || y4-j==1) || (i-x4 == 1 || x4-i == 1) && (j-y4 == 2 || y4-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x5 == 2 || x5-i == 2) && (j-y5 == 1 || y5-j==1) || (i-x5 == 1 || x5-i == 1) && (j-y5 == 2 || y5-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x6 == 2 || x6-i == 2) && (j-y6 == 1 || y6-j==1) || (i-x6 == 1 || x6-i == 1) && (j-y6 == 2 || y6-j==2))
                                 arr[i][j]=1;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i-x7 == 2 || x7-i == 2) && (j-y7 == 1 || y7-j==1) || (i-x7 == 1 || x7-i == 1) && (j-y7 == 2 || y7-j==2))
                                 arr[i][j]=1;
                        bool f = true;
                        for (int i=0;i<8;i++)
                           for (int j=0;j<8;j++)
                              if ((i+j) % 2 == 1)
                                 if (arr[i][j] != 1)
                                    f = false;
                        if (f){
                           cout<<"============="<<endl;
                           cout<<x1<<"  "<<y1<<endl;
                           cout<<x2<<"  "<<y2<<endl;
                           cout<<x3<<"  "<<y3<<endl;
                           cout<<x4<<"  "<<y4<<endl;
                           cout<<x5<<"  "<<y5<<endl;
                           cout<<x6<<"  "<<y6<<endl;
                           cout<<x7<<"  "<<y7<<endl;
                        }
                     }
                  }
               }
            }
         }
      }
   }
   cout<<count<<endl;
   return 0;
}

 Профиль  
                  
 
 Re: Задача о семи конях
Сообщение22.11.2014, 01:51 
Аватара пользователя


01/12/11

8634
12d3
Во-вторых, спасибо!
А во-первых, мне ещё стыднее, я вообще программировать не умею.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модератор: Модераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group