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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2007, 09:16   #1
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
Восклицание ПОМОГИТЕ С ЗАДАЧКОЙ!!!!

ПЛзззззззз..... Напишите пожалуйста объяснения к этой задачке..... Суть ее вот в чем: требуется перечислить все способы расстановки 8-ми ферзей на шахматной доске 8 на 8, при которых они не бьют друг друга.

Сама программка на Паскале:

program Queens;
const N=8;
type Index=1..N;
Rasstanovka=array [Index] of 0..N;
var X:Rasstanovka;
Count:word;
function P(var X:Rasstanovka;k,y:Index):boolean;
var i:Index;
begin
i:=1;
while (i<k)and(y<>X[i])and(abs(k-i)<>abs(y-X[i])) do inc(i);
P:=i=k
end;
procedure Backtracking(k:Index);
var i,y:Index;
begin
for y:=1 to N do
if P(X,k,y) then
begin
X[k]:=y;
if k=N then
begin
for i:=1 to N do write(X[i]);writeln;inc(Count)
end;
Backtracking(k+1)
end
end;
begin
Count:=0;
writeln('Расстановки ',N,' ферзей:');
Backtracking(1);
writeln('Всего ',Count,' расстановок')
end.

Заранее большое СПАСИБО!!!!!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 21.06.2007, 10:38   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Объяснить что значат разные типы/переменные или что-то другое?
Jeni вне форума Ответить с цитированием
Старый 21.06.2007, 10:40   #3
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

Да подробно описать..... Что за функция, что за процедура..... Мне просто ее надо сдать завтра.... А препод к каждой строчке придерается.....
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 21.06.2007, 10:41   #4
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Я думаю ему(ей) нужны комментарии... Кстати, хочу отметить, что задание поставлено крайне правильно. Как наставление новичкам: Смотрите и учитесь!
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 21.06.2007, 10:53   #5
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

Ну а вы мне поможете???? Пожалуйста..........!!!!! Очень ВАС ВСЕХ прошуууууу!!!!.....
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 21.06.2007, 12:23   #6
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Вот то, что удалось на скорую руку. Код немного "переформатирован", чтобы не смешивалось все в одну кучу.

Код:
const
  // Количество ферзей (размер доски)
  // Можно задавать и другое число
  N = 8;

type
  // Тип переменной. Все переменные этого типа
  // будут примать значения от 1 до N (т.е. до 8)
  Index = 1..N;

  // Тип массива. Переменная такого типа будет содержать
  // N элементов (т.е. 8) и каждый элемент может
  // принимать значения от 0 до N
  Rasstanovka = array [Index] of 0..N;

var
  // Переменная-массив, будет содержать (как я понимаю)
  // позиции ферзей на доске
  X: Rasstanovka;

  // Переменная-счетчик, в нее записывается количество
  // разных вариантов перестановок
  // Может принимать значения от 0 до 65535
  Count: Word;

function P(var X: Rasstanovka; k, y: Index): boolean;
var
  I: Index;
begin
  i := 1;

  // Цикл, переменная i увеличивается
  // пока выполняются приведенные условия
  while (i < k) and (y <> X[i]) and (abs(k-i) <> abs(y-X[i])) do inc(i);

  // Если переменная i равна переменной k, то
  // функция возвращает значение True (т.е. "да/верно")
  // В противном случае - возвращается значение False
  P := (i = k);
end;

// Основная процедура перебора вариантов расстановки
// В процедуру передается номер линии на доске
// с которой следует расставлять ферзей
procedure Backtracking(k: Index);
var
  i,y:Index; // Локальные переменные
begin
  // Цикл (переменная y последовательно меняется от 1 до N)
  for y:=1 to N do
    // Вызывается функция P с определенными параметрами
    // Если функция возвращает значение = True, то
    // выполняется код после слова then
    if P(X,k,y) then
      begin
        // В массив X в элемент k записывается текущее значение y
        X[k] := y;

        // Проверка условия равенства k и N
        // т.е. достигнута ли последняя строка на доске
        if k = N then
          begin
            // В цикле выводятся на экран позиции ферзей
            // на доске. Эти позиции берутся из массива X
            for i := 1 to N do Write(X[i]);

            // Вывод пустой строки (отступа)
            WriteLn;

            // Увеличивается счетчик
            Inc(Count);
          end;

        // Процедура вызывает сама, это называется РЕКУРСИЯ
        // Когда найдено расположение ферзя на очередной строке
        // вызывается процедура для его поиска на следующей
        // строке (строки - горизонтали шхматной доски)
        Backtracking(k+1);
      end;
end;

begin
  // Обнулить счетчик количества вариантов
  Count := 0;

  // Вывод строки - сколько ферзей берется для расстановки
  writeln('Расстановки ', N, ' ферзей:');

  // Вызов процедуры поиска ферзя на первой строке
  // В дальнейшем эта процедура будет вызывать сама себя
  // для всех остальных строк (т.е. рекурсивно)
  Backtracking(1);

  // Вывод строки - сколько всего было расстановок
  // Сами расстановки печатаются в процедуре Backtracking
  writeln('Всего ', Count, ' расстановок')
end.
Кстати, эта программа находит количество перестановок (надеюсь правильно, это я не проверял) без учета симметрии. С учетом симметричности уникальных перестановок будет в 4 раза меньше.

Последний раз редактировалось Jeni; 21.06.2007 в 12:58.
Jeni вне форума Ответить с цитированием
Старый 22.06.2007, 09:09   #7
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

СПАСИБО ВАМ ВСЕМ ОГРОМНОЕ!!!!!!!!!!!!!! ВЫ ВСЕ ПРОСТО СУПЕР!!!!!!!!!!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите плз с задачкой Dendy Паскаль, Turbo Pascal, PascalABC.NET 6 05.02.2008 22:16
Помогите с задачкой по СИ pliz Общие вопросы C/C++ 7 10.12.2007 20:08
Помогите с задачкой Saniok Помощь студентам 4 29.09.2007 20:34
помогите с задачкой.. plz Diller Помощь студентам 3 28.09.2007 20:03
Помогите с задачкой Sour Помощь студентам 9 08.05.2007 20:56