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
914
Проверил на компе. С учетом симметричных - две. К сожалению, я не могу видеть картинок с радикала, так что предположу, что они совпадают с теми, что в первом посте. Этакие "квадрат без угла" и "самолет".
Без учета симметрий 4.

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


01/12/11

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

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


04/03/09
914
Он ужасен и мне стыдно его показывать, но раз просите..
Код:
#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 ] 

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



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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