Обсуждение:Задача о восьми ферзях

message: Поленились товарищи и не описали алгоритм, скажем с использованием С/С++.
replies: text: Во-первых, пожалуйста, подписывайтесь в обсуждениях.

text: Во-вторых — Вы тоже поленились. Правьте смело! --dm обсужд. 07:24, 27 апреля 2010 (UTC)
 Пожалуйста на Си:
  # include <stdio.h>
 # include <math.h>
 main()
 { int a,b,c,d,e,f,g,h,i,q ;
    int m0,m1,m2,m3,m4,m5,m6,m7,m8;
  i=0;
   a=0;
  m0: b=0;
   ++a;
  if(a==9)
      goto m8;
  m1:c=0;
        ++b;
   if(b==9)     
      goto m0 ;
   if(b==a)
      goto m1;
   if (fabs(b-a)==1)
      goto m1;
  m2:d=0;
  ++c;
   if (c==9)
      goto m1;
   if (c==a || c==b)
      goto m2;
   if(fabs(c-b)==1 || fabs(c-a)==2)
      goto m2;
 m3:e=0;
 ++d;
   if (d==9)
      goto m2;
   if (d==a || d==b || d==c)
     goto m3;
   if (fabs(d-a)==3 || fabs(d-b)==2 || fabs(d-c)==1)
    goto m3;
 m4:f=0;
  ++e;
   if (e==9)
    goto m3;
   if (e==a || e==b || e==c || e==d)
    goto m4;
   if (fabs(e-d)==1 || fabs(e-c)== 2 || fabs (e-b)==3 || fabs(e-a)==4)
   goto m4;
 m5:g=0;
  ++f;
   if (f==9)
    goto m4;
   if (f==a || f==b || f==c || f==d || f==e)
     goto m5;
 if (fabs(f-e)==1 || fabs(f-d)==2 || fabs(f-c)==3 || fabs(f-b)==4 || fabs(f-a)==5)
     goto m5;
 m6:h=0;
 ++g;
    if (g==9)
    goto m5;
  if (g==a || g==b || g==c || g==d || g==e || g==f)
    goto m6;
  if (fabs(g-f)==1 || fabs(g-e)==2 || fabs(g-d)==3 || fabs(g-c)==4 || fabs(g-b)==5 )
    goto m6;
  if (fabs(g-a)==6)
  goto m6;
 m7:++h;
  if (h==9)
   goto m6;
  if (h==a || h==b || h==c || h==d || h==e || h==f || h==g)
   goto m7;
  if (fabs(h-g)==1 || fabs(h-f)==2 || fabs(h-e)==3 || fabs(h-d)==4 || fabs(h-c)==5)
    goto m7;
   if (fabs(h-b)==6 || fabs(h-a)==7)
    goto m7;
     ++i;
  printf(" %d",i);
  printf(":");
       printf("%d%d%d%d%d%d%d%d",a,b,c,d,e,f,g,h);
       printf(";");
       goto m7;
      m8:   q= getchar();
  }
 Правда пятёрку за такую программу не поставят-ведь в ней goto.
 alex62.148.136.45 16:25, 4 января 2011 (UTC)
          Но это только демонстрация метода перебора с возвратом.
Этот алгоритм можно записать компактно и обобщить на любое n.
 Результат записывается в файл,который создаётся в той же папке,
где находится данная программа(FileEditor). Чтобы его увидеть,
нужно выбрать All files(“.”).
 # include <stdio.h>
 # include <math.h>
  
   main()
      
      { int k,n,j;
     int m1,m2,m3,m4;
     long i; 
     char filename [15];
     printf(" Input filename with .dat");
     scanf("%s",filename);
     FILE*fp;
        fp =fopen(filename,"w");
     printf("n=");   
     scanf("%d",&n);
          int y[n+1];
     k=0;
     j=0;
     i=0;
   m1:k=k+1;
   y[k]=0;
    if(k==n+1)
    goto m2;
        m3:  y[k]=y[k]+1;
       if(y[1]==n+1)
     goto m4;
     if (y[k]==n+1){
      y[k]=0;
      k=k-1;
      goto m3;}
         for(j=1;j<k;++j){
         if(y[j]==y[k] || fabs(y[k]-y[j])==k-j)
     goto m3;}
     goto m1;
      m2:i=i+1;
     
      fprintf(fp,"%d",i);
     fprintf(fp,":");
     for(j=1;j<n+1;++j){
     fprintf(fp,"%d",y[j]);
      fprintf(fp," ");}
      fprintf(fp,"\n ");
                        
     k=k-1;
     goto m3;
    
      m4: fclose(fp);
          
     }
86.110.166.46 05:45, 18 июня 2011 (UTC) Alex

message: Есть N² ферзей N различных цветов, по N ферзей каждого цвета. Сколькими способами можно расставить все эти ферзи на шахматной доске NxN таким образом, что ферзи одного цвета друг друга не бьют?
Что известно об этой задаче?
Я знаю только то, что для нечётных простых N есть как минимум N-3 решений (без учёта N! перестановок цветов).
-Тальмон Сильвер-62.219.167.60 21:26, 28 января 2011 (UTC)
   Действительно,для доски 7*7 имеем 4-е группы позиций,
  заполняющих всю доску.Для доски 11*11 их восемь.Для до-
  сок 8*8,9*9 и 10*10 таких групп не обнаружено.
  Для доски 7*7 имеем 40 позиций для 7-и ферзей не атакую-
  щих друг друга. 
  Вот группы позиций ,заполняющих всю доску.
                                 
 1  3  5  7  2  4  6 
 2  4  6  1  3  5  7 
 3  5  7  2  4  6  1 
 4  6  1  3  5  7  2 
 5  7  2  4  6  1  3 
 6  1  3  5  7  2  4 
 7  2  4  6  1  3  5 
                                    
 1  4  7  3  6  2  5 
 2  5  1  4  7  3  6 
 3  6  2  5  1  4  7 
 4  7  3  6  2  5  1 
 5  1  4  7  3  6  2 
 6  2  5  1  4  7  3 
 7  3  6  2  5  1  4 
                                    
 1  5  2  6  3  7  4 
 2  6  3  7  4  1  5 
 3  7  4  1  5  2  6 
 4  1  5  2  6  3  7 
 5  2  6  3  7  4  1 
 6  3  7  4  1  5  2 
 7  4  1  5  2  6  3 
                                    
 1  6  4  2  7  5  3 
 2  7  5  3  1  6  4 
 3  1  6  4  2  7  5 
 4  2  7  5  3  1  6 
 5  3  1  6  4  2  7 
 6  4  2  7  5  3  1 
 7  5  3  1  6  4  2 
 
 Для доски 11*11 имеется 2680 позиций
 11 -и ферзей не бьющих друг друга.
 Вот 8-мь групп этих позиций,заполняющих всю доску.                                   
 1 
 1  3  5  7  9  11  2  4  6  8  10 
 2  4  6  8  10  1  3  5  7  9  11 
 3  5  7  9  11  2  4  6  8  10  1 
 4  6  8  10  1  3  5  7  9  11  2 
 5  7  9  11  2  4  6  8  10  1  3 
 6  8  10  1  3  5  7  9  11  2  4 
 7  9  11  2  4  6  8  10  1  3  5 
 8  10  1  3  5  7  9  11  2  4  6 
 9  11  2  4  6  8  10  1  3  5  7 
 10  1  3  5  7  9  11  2  4  6  8 
 11  2  4  6  8  10  1  3  5  7  9 
                                    
 2 
 1  4  7  10  2  5  8  11  3  6  9 
 2  5  8  11  3  6  9  1  4  7  10 
 3  6  9  1  4  7  10  2  5  8  11 
 4  7  10  2  5  8  11  3  6  9  1 
 5  8  11  3  6  9  1  4  7  10  2 
 6  9  1  4  7  10  2  5  8  11  3 
 7  10  2  5  8  11  3  6  9  1  4 
 8  11  3  6  9  1  4  7  10  2  5 
 9  1  4  7  10  2  5  8  11  3  6 
 10  2  5  8  11  3  6  9  1  4  7 
 11  3  6  9  1  4  7  10  2  5  8 
                                    
 3 
 1  5  9  2  6  10  3  7  11  4  8 
 2  6  10  3  7  11  4  8  1  5  9 
 3  7  11  4  8  1  5  9  2  6  10 
 4  8  1  5  9  2  6  10  3  7  11 
 5  9  2  6  10  3  7  11  4  8  1 
 6  10  3  7  11  4  8  1  5  9  2 
 7  11  4  8  1  5  9  2  6  10  3 
 8  1  5  9  2  6  10  3  7  11  4 
 9  2  6  10  3  7  11  4  8  1  5 
 10  3  7  11  4  8  1  5  9  2  6 
 11  4  8  1  5  9  2  6  10  3  7 
                                    
 4 
 1  6  11  5  10  4  9  3  8  2  7 
 2  7  1  6  11  5  10  4  9  3  8 
 3  8  2  7  1  6  11  5  10  4  9 
 4  9  3  8  2  7  1  6  11  5  10 
 5  10  4  9  3  8  2  7  1  6  11 
 6  11  5  10  4  9  3  8  2  7  1 
 7  1  6  11  5  10  4  9  3  8  2 
 8  2  7  1  6  11  5  10  4  9  3 
 9  3  8  2  7  1  6  11  5  10  4 
 10  4  9  3  8  2  7  1  6  11  5 
 11  5  10  4  9  3  8  2  7  1  6 
                                    
 5 
 1  7  2  8  3  9  4  10  5  11  6 
 2  8  3  9  4  10  5  11  6  1  7 
 3  9  4  10  5  11  6  1  7  2  8 
 4  10  5  11  6  1  7  2  8  3  9 
 5  11  6  1  7  2  8  3  9  4  10 
 6  1  7  2  8  3  9  4  10  5  11 
 7  2  8  3  9  4  10  5  11  6  1 
 8  3  9  4  10  5  11  6  1  7  2 
 9  4  10  5  11  6  1  7  2  8  3 
 10  5  11  6  1  7  2  8  3  9  4 
 11  6  1  7  2  8  3  9  4  10  5 
                                    
 6 
 1  8  4  11  7  3  10  6  2  9  5 
 2  9  5  1  8  4  11  7  3  10  6 
 3  10  6  2  9  5  1  8  4  11  7 
 4  11  7  3  10  6  2  9  5  1  8 
 5  1  8  4  11  7  3  10  6  2  9 
 6  2  9  5  1  8  4  11  7  3  10 
 7  3  10  6  2  9  5  1  8  4  11 
 8  4  11  7  3  10  6  2  9  5  1 
 9  5  1  8  4  11  7  3  10  6  2 
 10  6  2  9  5  1  8  4  11  7  3 
 11  7  3  10  6  2  9  5  1  8  4 
                                    
 7 
 1  9  6  3  11  8  5  2  10  7  4 
 2  10  7  4  1  9  6  3  11  8  5 
 3  11  8  5  2  10  7  4  1  9  6 
 4  1  9  6  3  11  8  5  2  10  7 
 5  2  10  7  4  1  9  6  3  11  8 
 6  3  11  8  5  2  10  7  4  1  9 
 7  4  1  9  6  3  11  8  5  2  10 
 8  5  2  10  7  4  1  9  6  3  11 
 9  6  3  11  8  5  2  10  7  4  1 
 10  7  4  1  9  6  3  11  8  5  2 
 11  8  5  2  10  7  4  1  9  6  3 
                                    
 8 
 1  10  8  6  4  2  11  9  7  5  3 
 2  11  9  7  5  3  1  10  8  6  4 
 3  1  10  8  6  4  2  11  9  7  5 
 4  2  11  9  7  5  3  1  10  8  6 
 5  3  1  10  8  6  4  2  11  9  7 
 6  4  2  11  9  7  5  3  1  10  8 
 7  5  3  1  10  8  6  4  2  11  9 
 8  6  4  2  11  9  7  5  3  1  10 
 9  7  5  3  1  10  8  6  4  2  11 
 10  8  6  4  2  11  9  7  5  3  1 
 11  9  7  5  3  1  10  8  6  4  2 
                                    
 В принципе ещё можно найти такие группы
 для доски 13*13,но для дальнейших расчётов время
 будет слишком большим.
 Интересно,что и диагонали (в первой и последней группах только одна)
 представляют собой позиции из предыдущей и последующей групп.
thread_title:  Сопредельная задача 

message: Я считаю, что максимальное число комбинаций из 8 ферзей- 196. Домин Яков  Анастасия30399 (обс.) 13:07, 20 мая 2017 (UTC)
thread_title:  Задача о максимальном числе комбинаций из 8 ферзей 

message: По вопросам о моем решении звонить на 84992005196 Анастасия30399 (обс.) 13:16, 20 мая 2017 (UTC)
thread_title:  Задача о максимальном числе комбинаций из 8 ферзей 

message: Любопытно, установлено ли, какая это задача? NP? NP-полная? NP-трудная? 
217.107.126.124 16:12, 2 сентября 2017 (UTC)MichaelMM
thread_title:  Класс задачи 

message: Идея в том, что для досок, размерности которых есть число из ряда 
2, 3, 8, 9, 14, 15, 20, 21, 26, 27, 32, 33, 38, 39, 44, 45, 50, 51, 56, 57, 62, 63, 68, 69, 74, 75, 80, 81, 86, 87, 92, 93, 98, 99, 104, 105, 110, 111, 116, 117, 122, 123, 128, 129, 134, 135, 140, 141, 146, 147, 152, 153, 158, 159, 164, 165, 170, 171, 176, 177, 182, 183
(http://oeis.org/A047243)
не возможно построение решения алгоритмом "Ступеньки". Алгоритм "Ступеньки" представляет из себя числовой ряд, который начинается из всех четных чисел и продолжается нечетными по возрастанию (2 4 6 8 10 1 3 5 7 9 для доски 10х10). Данное утверждение справедливо для всех досок, размер которых не вход в числовую последовательность A047243. Для проверки входит ли n в числовую последовательность A047243, необходимо разделить n на 6 и если остаток от деления равен 2 или 3, то однозначно нет решения для данной доски алгоритмом "Ступеньки". Ниже дан псевдокод.
if ((n mod 6) !== 2) AND ((n mod 6) !== 3)
then
     call horse_step_algo()
Пример: n = 2017 (2017x2017)
n mod 6 -> 2017 mod 6 = 1 - решение есть, 2 4 6 8 10 ..... 2016 1 3 5 7 9 ..... 2017
пс: Уточнение по поводу записи решения - 2 4 6 8 10 1 3 5 7 9 само число есть номер столбца, позиция числа в решении есть номер строки, 2 - второй столбец первая строка, 4 - 4 столбец вторая строка.
 Amanda Sproule (обс.) 21:25, 10 декабря 2017 (UTC)
thread_title:  Частичное решение задачи для NxN 

message: "и затем проверяя атаки по диагоналям, можно сократить число возможных расположений всего до 40 320 (то есть 8!)" - 8! является числом возможных комбинаций ДО проверки диагоналей а не после
thread_title:  Неточность в количестве возможных комбинаций