Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Rustam Gadeyev                       2:5008/14      19 Oct 2001  18:39:36
 To : Evgeny Sharandin
 Subject : 8 мирных ферзей
 -------------------------------------------------------------------------------- 
 
 
 18 Окт 01 12:17, Evgeny Sharandin wrote Rustam Gadeyev:
 
  ES> Почти в 2 раза уже есть, как еще уже написал. Смена BP на spb или GPC
  ES> еще раза в 2 пришпорит. Пусть будет, в сумме, в 4 раза (чего
  ES> жадничать-то?). А если учесть симметрию, то для доски 8х8, в пределе,
  ES> можно еще сократить время до 12/92. Короче, ускорение на порядок - это
  ES> очень скромно.
 
 Я что-то не совсем понял, как можно нормально пристроить проверку на симметрию и
 получить при этом ускорение в 4 раза. А вот на другом компиляторе (BC3.1 и
 WC10.0) программа заметно ускоряется. Hо это ведь не считается заслугой
 программиста?
  Вот переделанный 1 в 1 вариант на C. Вывод позиций работает только на BC.
 //---  8pherz.c ---\\
 #include <conio.h>;   //written by Rustam G. 19.10.2001
 #define num 14         //BC3.1 P3-450: 14 11.75, 13 1.92
                        //WC10.0 /5 /oilr /s : 14 12.58, 13 2.08
   unsigned char a[num+1]; //позиции ферзей
   unsigned char p[num*2-1+1],d1[num*2-1+1],d2[num*2-1+1];
   unsigned char i,j;
   unsigned long int kol;
 
 void work(void) {
 unsigned int t,n;
     n=1;a[n]=1;kol=0;t=a[n];
     for (;;) {
     //если сюда можно поставить ферзя
     if (p[t] & d1[t+n-1] & d2[num-t+n]) {
      if (n==num) { //если встал последний ферзь, комбинация достигнута
       kol++;
       //вывод на экран
 /*удалить этот комментарий для вывода на экран
       clrscr();
       a[n]=t;
       for (i=1;i<=num;i++)
        for (j=1;j<=num;j++) {
         gotoxy(j*2,i);
         if (a[j]==i) cprintf("%u",j); else cprintf("* ");
        }
       if (getch()==27) return; //по позициям */
      }
      else { //если это не последний ферзь, попробуем поставить еще
       p[t]=0;             //запрет горизонтали и диагоналей
       d1[t+n-1]=0; d2[num-t+n]=0;
       a[n]=t;             //этот ферзь будет стоять здесь
       n++;                //к следующем ферзю
       t=1;                //начиная с позиции 1
       continue;           //летим пробовать поставить еще один ферзь
      }
     }
     //идем на новую позицию
     for (;;) {
      if (t<num) {
       t++;
       break; //еще есть позиции для перебора в столбце}
      } else {               //этот столбик уже весь перебрали
       n--;                  //отступаем
       if (n<1) return;       //больше некуда?
       t=a[n];
       p[t]=1;            //разрешить горизонталь и диагонали
       d1[t+n-1]=1; d2[num-t+n]=1;
      }
     }
   }
 }
 
 void main() {
   for (i=1;i<=(num*2-1);i++) { p[i]=1; d1[i]=1; d2[i]=1; }
 
   work();
 
   cprintf("\r\n%lu вариантов\r\n",kol);
 }
 \\---  8pherz.c ---//
 
 Good Bye.
 
 --- ---
  * Origin: Ulan-Ude. Buryatia. (2:5008/14)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 8 мирных ферзей   Rustam Gadeyev   11 Oct 2001 22:36:29 
 8 мирных ферзей   Max Alekseyev   11 Oct 2001 11:52:52 
 8 мирных ферзей   Evgeny Sharandin   18 Oct 2001 12:17:00 
 8 мирных ферзей   Rustam Gadeyev   19 Oct 2001 18:12:36 
 8 мирных ферзей   Evgeny Sharandin   23 Oct 2001 14:39:00 
 8 мирных ферзей   Rustam Gadeyev   24 Oct 2001 20:17:36 
 8 мирных ферзей   Evgeny Sharandin   27 Oct 2001 00:15:00 
 8 мирных ферзей   Rustam Gadeyev   27 Oct 2001 12:07:44 
 8 мирных ферзей   Rustam Gadeyev   19 Oct 2001 18:39:36 
 8 мирных ферзей   Evgeny Sharandin   23 Oct 2001 14:26:00 
Архивное /ru.algorithms/191323bd07503.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional