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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2011, 17:53   #1
COBECTb
Новичок
Джуниор
 
Аватар для COBECTb
 
Регистрация: 18.01.2011
Сообщений: 1
По умолчанию Про ферзей на abc Pascal

Здравствуйте, прошу Вас, дорогие форумчане, выручить меня в сложной ситуации! Я на пороге отчисления из вуза! Понятное дело в голове у меня сейчас не только информатика, а еще один предмет, препод по которому зверь просто, ну собственно не об этом разговор. Если вас не затруднит, не могли бы Вы, помочь в написании следующей программы:

Дано шахматное поле nXn расставить n ферзей так чтобы они не били друг друга. 1) какая минимальная размерность поля на которой n ферзей можно расставить так, чтобы они друг друга не били.
2) посчитать кол-во решений при поле размером 10х10 и соответственно 10 ферзей

И конечно же небескорыстно!!! Благодарности на webmoney.
COBECTb вне форума Ответить с цитированием
Старый 18.01.2011, 23:03   #2
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

Обращайся в асю 600-927-970 помогу
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Старый 19.01.2011, 07:51   #3
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
посчитать кол-во решений при поле размером 10х10 и соответственно 10 ферзей
Код:
program queens;
uses crt;
 const n = 10;
   var  k: 0..n;
          c: array [1..n] of 1..n;
   count:integer;

    procedure begin_work; {начать работу}
    begin
     k := 0;
    end;

    function danger: boolean; {верхний ферзь под боем}
     var b: boolean;
            i: integer;
    begin
      if k <= 1 then begin
        danger := false;
      end else begin
        b := false; i := 1;
        {b <=> верхний ферзь под боем ферзей с номерами < i}
        while i <> k do begin
          b := b or (c[i]=c[k]) {вертикаль}
              or (abs(c[i]-c[k])=abs(i-k)); {диагональ}
          i := i+ 1;
          end;
          danger := b;
       end;
    end;

    function is_up: boolean; {есть_сверху}
    begin
      is_up := (k < n) and not danger;
    end;

    function is_right: boolean; {есть_справа}
    begin
      is_right := (k > 0) and (c[k] < n);
    end;
    {возможна ошибка: при k=0 не определено c[k]}

    function is_down: boolean; {есть_снизу}
    begin
      is_down := (k > 0);
    end;


    procedure up; {вверх_налево}
    begin {k < n}
      k := k + 1;
      c [k] := 1;
    end;

    procedure right; {вправо}
    begin {k > 0,  c[k] < n}
      c [k] := c [k] + 1;
    end;

    procedure down; {вниз}
    begin {k > 0}
      k := k - 1;
    end;

    procedure work; {обработать}
      var i: integer;
    begin
      if (k = n) and not danger then begin
        inc(count);
        for i := 1 to n do begin
          write ('<', i, ',' , c[i], '> ');
        end;
        
        writeln;
      end;
    end;

    procedure UW; {вверх_до_упора_и_обработать}
    begin
      while is_up do begin
        up;
      end;
      work;
    end;

  begin
  count:=0;
    begin_work;
    UW;
    while is_down do begin
      if is_right then begin
        right;
        UW;
      end else begin
        down;
      end;
    end;
    writeln('Количество расстановок:',count)
  end.
результат
Цитата:
Количество расстановок:724
Цитата:
какая минимальная размерность поля на которой n ферзей можно расставить так, чтобы они друг друга не били.
1 на 1 --- 1 ферзь никого не бьет и его никто не бьет
если n>1 тогда 4 на 4 --- 2 расстановки
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
Другая задача про ферзей (язык Си) xakep139 Помощь студентам 3 11.05.2009 18:33
Решение задачи про ферзей yuran80 Паскаль, Turbo Pascal, PascalABC.NET 5 08.10.2008 12:59