Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 22:12   #1
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию 8 ферзей. Основные расстановки.

Как известно для 8 ферзей на доске 8х8 существует 92 различных случая.
Но они получаются путем отображений, поворотов...
Всего основных расстановок должно быть 12.
Что я не учел? у меня 24 выходит...
Код:
uses crt;
var
m:array [1..8] of integer;
q:array [0..100,1..8] of integer;
p:integer;
function test(l,i:integer):boolean;
var
 j:integer;
begin
  test:=true;
  for j:=1 to l-1 do
   if (i=m[j]) or (m[j]+j=i+l) or (m[j]-j=i-l) then begin
     test:=false;  exit
   end;
end;

procedure svp(var a,b:integer);
var c:integer;
begin
c:=a;
a:=b;
b:=c;
end;

function tst: boolean;
var
s:boolean;
i,j:integer;
mm:array [1..8] of integer ;
begin
 tst:=false;
 for i:=1 to 8 do mm[i]:=m[i];
 for i:=1 to 4 do svp(mm[i],mm[9-i]);

 for i:=0 to p-1 do begin
   s:=true;
   for j:=1 to 8 do s:=s and (mm[j]=q[i,j]);
   if s then exit;
  end;

 for i:=1 to 8 do mm[i]:=9-mm[i];
 for i:=0 to p-1 do begin
   s:=true;
   for j:=1 to 8 do s:=s and (mm[j]=q[i,j]);
   if s then exit;
  end;

 for i:=1 to 8 do mm[i]:=m[i];
 for i:=1 to 8 do mm[i]:=9-mm[i];

 for i:=0 to p-1 do begin
   s:=true;
   for j:=1 to 8 do s:=s and (mm[j]=q[i,j]);
   if s then exit;
  end;
  
  tst:=true;
end;


procedure qn(l:integer);
 var i:integer;
begin
 if l>8 then begin

  if tst then begin
  for i:=1 to 8 do q[p,i]:=m[i];
  inc(p)
  end;
 end
 else
 for i:=1 to 8 do
 begin
  if test(l,i) then begin
   m[l]:=i;
   qn(l+1);
  end;
 end;
end;
var i,j:integer;
begin
p:=0;
clrscr;
qn(1);

for i:=0 to p-1 do begin
 for j:=1 to 8 do write(q[i,j]);
 writeln;
end;
writeln(p);
readln;
end.
boomeer вне форума Ответить с цитированием
Старый 20.11.2010, 18:36   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Но они получаются путем отображений, поворотов...
две осевые симметрии + три поворота = ПЯТЬ проверок
У вас я нашел только три.
Назовите (себе) какие Вы сделали и легко узнаете что осталось сделать.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильность расстановки переменных segail Microsoft Office Excel 4 01.09.2010 17:01
Алгоритм Лас Вегаса для расстановки восьми ферзей Сурка Помощь студентам 18 31.05.2010 18:59
8 ферзей battlefrogg Помощь студентам 5 06.05.2010 15:28
8 ферзей slim5 Общие вопросы Delphi 0 15.06.2008 11:46
Вопрос по организации поиска и расстановки меток Melifaro Компоненты Delphi 4 01.11.2007 09:53