IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Перестановки, Delphi
Tri
сообщение 29.9.2008, 6:27
Сообщение #1


Студент
**

Группа: Продвинутые
Сообщений: 94
Регистрация: 26.10.2007
Город: Тюмень
Учебное заведение: ТГНГУ
Вы: студент



Есть вот такая задача:
Цитата
Напишите программу для определения при разных значениях n числа перестановок PI=(pi 1,pi 2,…,pi n) на множестве {1,2,…n}, которые обладают тем свойством, что из pi i- i = pi j-j (mod n) следует i=j.

Я не совсем понимаю как реализовать условие, и что должно получиться.
Подскажите, пожалуйста, решение.
Вот такие наработки:
Код

{ программа генерации перестановок N элементного
  множества в лексикографическом порядке }

Program perms;
var
  i, j, h, n, k, x, y: integer;
  a:array[0 .. 100] of integer;  { массив для хранения перестановки }

{процедура вывода полученной перестановки}
procedure output;
var i: integer;
begin
  writeln;
  for i:=1 to n do write(a[i],' ');
end;

begin
  write('количество элементов перестановки: '); readln(n);
  fillchar(a, sizeof(a), 0);

  { ввод элементов начальной перестановки }
  for i:=1 to n do a[i]:=i;
  i:=n;
  j:=i;
  repeat

//здесь пытаюсь проверить условие (не уверена, что оно вообще здесь должно быть)

  
    x:= a[i]-i;
    y:=a[j]-j mod n;
    if (x=y) and (i=j) then

    output;  { вывод текущей перестановки }
    i:=n;
    while a[i-1]>a[i] do dec(i); { поиск скачка }
    j:=i-1;
    h:=a[j];
    while a[i+1]>h do inc(i); { поиск первого меньшего элемента }
    a[j]:=a[i];  a[i]:=h;
    i:=j+1; k:=n;
    while i<k do begin { перестановка ”хвоста” }
       h:=a[i]; a[i]:=a[k]; a[k]:=h;
       inc(i); dec(k)              
    end
  until j=0;
end.

Заранее большое спасибо!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 29.9.2008, 15:12
Сообщение #2


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Хм, я тоже не очень понял условие, особенно необходимое свойство. Условие точно записано в таком виде без всяких дополнительных скобочек или индексов?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tri
сообщение 29.9.2008, 15:25
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 94
Регистрация: 26.10.2007
Город: Тюмень
Учебное заведение: ТГНГУ
Вы: студент



Вот исходник задания)


Прикрепленные файлы
Прикрепленный файл  doc.doc ( 19.5 килобайт ) Кол-во скачиваний: 20
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 29.9.2008, 16:13
Сообщение #4


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Перевожу на русский язык (IMG:style_emoticons/default/smile.gif).
У нас есть куча объектов какого-то класса pi, а именно числа. Чисел у нас ровно n, причем начинаются они с единицы. И мы хотим эти числа перемешать. Но кто-то захотел, чтобы при перемешивании (всеми способами) мы кое-что посчитали, а именно, сколько же всего возможно комбинаций при данном числе объектов, когда все значения выражения "текущее положение числа минус само число" будут различны, причем по модулю n.
У кого есть возражения? (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tri
сообщение 29.9.2008, 16:45
Сообщение #5


Студент
**

Группа: Продвинутые
Сообщений: 94
Регистрация: 26.10.2007
Город: Тюмень
Учебное заведение: ТГНГУ
Вы: студент



Честно говоря, не очень поняла:)
Значения выражения должны быть, наверное, одинаковыми, раз знак равенства? И не совсем понимаю как это запрограммировать, сравнение загнать в цикл, в котором менять i и j?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 29.9.2008, 17:27
Сообщение #6


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Запрограммировать можно все что угодно (IMG:style_emoticons/default/wink.gif)
Главное понять смысл (IMG:style_emoticons/default/smile.gif)
Чтобы pi[i] - i = pi[j] - j (mod n) выполнялось только при i = j, и не выполнялось при i <> j, нужно чтобы pi[i] - i для всех i=1..n было различно, ну это как я понял (IMG:style_emoticons/default/smile.gif).
Возможно я не прав, поэтому мне интересно послушать другие идеи.
P.S.
Задачку сдать нужно завтра? (IMG:style_emoticons/default/wink.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tri
сообщение 29.9.2008, 17:37
Сообщение #7


Студент
**

Группа: Продвинутые
Сообщений: 94
Регистрация: 26.10.2007
Город: Тюмень
Учебное заведение: ТГНГУ
Вы: студент



Спасибо большое за идею, попробую.
p.s.Нет, сдавать, к счастью, не завтра:)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 29.9.2008, 18:25
Сообщение #8


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Попробуйте (IMG:style_emoticons/default/wink.gif)
Если будет время, то завтра напишу свой вариантик (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 30.9.2008, 14:47
Сообщение #9


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Я добавил одну функцию в программу, которая для каждой позиции проверяет то, что я описывал выше. Посмотрите (IMG:style_emoticons/default/smile.gif)

Код
{ программа генерации перестановок N элементного
  множества в лексикографическом порядке }

Program perms;
var
  i, j, h, n, k, count: integer;
  a:array[0 .. 100] of integer;  { массив для хранения перестановки }

{процедура вывода полученной перестановки}
procedure output;
var i: integer;
begin
  writeln;
  for i:=1 to n do write(a[i],' ');
end;

function testposition:boolean;
var
  ta:array [0..100] of boolean;
  i: integer;
begin
  fillchar(ta, sizeof(ta), false);
  for i:=1 to n do
  begin
    if (ta[(a[i] - i + n) mod n] = false) then
      ta[(a[i] - i + n) mod n]:=true
    else
    begin
      Result:=false;
      Exit;
    end;
  Result:=true;
  end;

end;

begin
  write('количество элементов перестановки: ');
  readln(n);
  fillchar(a, sizeof(a), 0);
  count:=0;

  { ввод элементов начальной перестановки }
  for i:=1 to n do a[i]:=i;
  i:=n;
  j:=i;
  repeat

    //output;  { вывод текущей перестановки }
    if testposition then
      inc(count);
    i:=n;
    while a[i-1]>a[i] do dec(i); { поиск скачка }
    j:=i-1;
    h:=a[j];
    while a[i+1]>h do inc(i); { поиск первого меньшего элемента }
    a[j]:=a[i];  a[i]:=h;
    i:=j+1; k:=n;
    while i<k do begin { перестановка "хвоста" }
       h:=a[i]; a[i]:=a[k]; a[k]:=h;
       inc(i); dec(k)
    end
  until j=0;
  writeln(count);
  readln;
end.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
malk
сообщение 1.10.2008, 8:19
Сообщение #10


Школьник
*

Группа: Продвинутые
Сообщений: 24
Регистрация: 4.10.2007
Город: СПб



Код

procedure TForm1.Button1Click(Sender: TObject);
var s,n:integer;
type  sm=set of 0..99;

procedure rek(b,c:sm; i:integer);
var x:integer;
begin
   for x:=0 to n-1 do
      if (x in b)and(((x-i+n)mod n)in c) then
         begin
            if i<n-1 then rek(b-[x],c-[(x-i+n)mod n],i+1) else s:=s+1;
         end;
end;

begin
   s:=0;
   n:=strtoint(edit1.Text);
   rek([0..n-1],[0..n-1],0);
   label2.Caption:=inttostr(s);
end;

Для четных n искомое будет всегда равно 0.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.5.2025, 21:22

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru