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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 00:39   #1
SmartStas
 
Регистрация: 17.03.2009
Сообщений: 5
По умолчанию "Латинский" квадрат. Паскаль

Построить и вывести на экран "латинский" квадрат - таблицу, состоящую из n различных чисел, всех по n раз расположенных так, что в каждой строке и столбце каждое число встречается только один раз.
ВОт мой код:
Код:
Uses Crt;
Const n=10;
Type matrica=array[1..n,1..n] of integer;
Var m:matrica;
     i,j,k:integer;

Function Chek(var m:matrica;n,k,i1,j:integer):boolean;
Var i:integer;
BEgin
  chek:=true;
  For i:=1 to i1 do
  If m[i,j]=k then chek:=false;{проверка на встречаемость в столбце}
  if m[i1,j]<>0 then chek:=false;{проверка на занятость места елемента}
End;

Begin
  ClrScr;
  Randomize;
  For k:=1 to n do begin
    For i:=1 to n do begin
       repeat
       j:=random(n)+1;
       until chek(m,n,k,i,j);
    m[i,j]:=k; 
    end;
  End;
  For i:=1 to n do
  For j:=1 to n do 
  write(m[i,j]:3);
readln;
End.
Подскажите где я ошибся, программа иногда работает, но часто просто виснет =((
SmartStas вне форума Ответить с цитированием
Старый 17.03.2009, 08:30   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

вот фрагмент который формирует латинский квадрат
Код:
for i:=1 to n do m[1,i]:=i;
for i:=2 to n do
  for j:=1 to n do
    m[i,j]:=m[i-1,j] mod n+1;
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 17.03.2009, 16:16   #3
SmartStas
 
Регистрация: 17.03.2009
Сообщений: 5
По умолчанию

Спасибо, конечно, большое, но меня интересует случайное формирование такого квадрата,например:
1 3 2 5 4
2 5 1 4 3
4 1 5 3 2
3 2 4 1 5
5 4 3 2 1
SmartStas вне форума Ответить с цитированием
Старый 18.03.2009, 12:17   #4
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

а это разве не оно?
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 18.03.2009, 19:57   #5
SmartStas
 
Регистрация: 17.03.2009
Сообщений: 5
По умолчанию

нет он выводит упорядоченно:
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
SmartStas вне форума Ответить с цитированием
Старый 19.03.2009, 11:33   #6
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

Ошибка такая:
1 2 0
2 1 0
0 0 1
Двойку в третью строчку уже не поставит...

Последний раз редактировалось Buratino; 19.03.2009 в 16:05.
Buratino вне форума Ответить с цитированием
Старый 19.03.2009, 12:08   #7
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

Код:
Uses Crt;
Const n=9;
Type matrica=array[1..n,1..n] of integer;
Var m:matrica;
     i,j,k:integer;
     a:boolean;

Function Chek(var m:matrica;n,k,i1,j:integer):boolean;
Var i:integer;
BEgin
  chek:=true;
  For i:=1 to i1 do
  If m[i,j]=k then chek:=false;{проверка на встречаемость в столбце}
  if m[i1,j]<>0 then chek:=false;{проверка на занятость места елемента}
End;

function PROVERKA(var m:matrica;n,k,i1:integer):boolean;
 Var v,i:integer;
     a:boolean;
BEgin
  PROVERKA:=false;
  for v:=1 to n do
  begin
  a:=true;
  For i:=1 to i1 do
  If m[i,v]=k then a:=false;
  if m[i1,v]=0 then if a then Proverka:=true;
  end;
End;


Begin
  ClrScr;
  Randomize;

  For k:=1 to n do begin
    For i:=1 to n do begin
       repeat
       if not proverka(m,n,k,i) then
        begin
             For i:=1 to n do
             For j:=1 to n do
             m[i,j]:=0;
             i:=1;
             k:=1;
        
          end;
       j:=random(n)+1;
       until chek(m,n,k,i,j);

    m[i,j]:=k;
    end;
  End;
  
  For i:=1 to n do
  For j:=1 to n do
  begin

  write(m[i,j],' ');
  if j=n then writeln();
  end;
readln;

End.
Тупо, но работает!
Buratino вне форума Ответить с цитированием
Старый 19.03.2009, 14:52   #8
SmartStas
 
Регистрация: 17.03.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Buratino Посмотреть сообщение
Ошибка такая:
0 0 1
2 1 0
1 2 0
Двойку в третий столбик уже не поставит...
по моему она должна была сначала поставить двойку в первой строке.
А за исправление спасибо большое, задача довольно интересная просто=)
SmartStas вне форума Ответить с цитированием
Старый 19.03.2009, 16:13   #9
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

строки то можно перетасовать в матрице.
вот реализация:
Код:
var m:array[1..100,1..100] of integer;
    k:array[1..100] of integer;
    i,j,n,a,b,t:integer;
begin
  readln(n);
  for i:=1 to n do m[1,i]:=i;
  for i:=2 to n do
    for j:=1 to n do
      m[i,j]:=m[i-1,j] mod n+1;
  randomize;
  for t:=1 to 1000 do
    begin
      a:=random(n)+1;
      b:=random(n)+1;
      k:=m[a];
      m[a]:=m[b];
      m[b]:=k;
    end;
  for i:=1 to n do
    begin
      for j:=1 to n do write(m[i,j]:3);
      writeln;
    end;
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 19.03.2009, 16:37   #10
SmartStas
 
Регистрация: 17.03.2009
Сообщений: 5
По умолчанию

Цитата:
k:=m[a];
m[a]:=m[b];
m[b]:=k;
выдает: "type mismatch"
НАсколько я понял, после перетасовки не будет выполняться условие:
Цитата:
"расположенных так, что в каждой строке и столбце каждое число встречается только один раз."
SmartStas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Под прикрытием "кризиса" наши доблестные "управители" хотят утопить нас в радиоактивных отходах mihali4 Свободное общение 1 17.01.2009 01:43
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49