Люди помогите !!! Мне срочно до завтра необходимо написать программу «Латинский квадрат». Суть в том что если Вы вводите число 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
И так далее, я написал половину программы и у меня строится матрица вида,
1 2 3 4 5 2 3 4 5 1 3 4 5 0 2 4 5 0 0 3 5 0 0 0 4
а дальше не могу написать . Я могу выслать текст программы что бы кто – нибудь дописал мне ее, т.к. я не могу ее доделать.
Serega
7.11.2003 19:39
Вот мое решение.
program lat_kv;
uses crt;
var a:array[1..100,1..100] of integer;
i,j,n:integer;
begin
clrscr;
write('Введите размер ');
readln(n);
for i:=1to n dofor j:=1to n dobegin
a[i,j]:=j+i-1;
if a[i,j]>n then a[i,j]:=a[i,j]-n;
end;
for i:=1to n dobeginfor j:=1to n do
write(a[i,j],' ');
writeln;
end;
readln;
end.
-=BR@BUS=-
8.12.2006 2:15
А как сделать, чтобы программа определяла является ли введёная матрица - латинским квадратом?
volvo
8.12.2006 2:41
Я бы сделал так:
const{ Для проверки }
n = 4;
a: array[1 .. n, 1 .. n] of integer = (
(1, 2, 3, 4),
(2, 3, 4, 1),
(3, 4, 1, 2),
(4, 1, 2, 3)
);
var
value, i, j, s, sum, check: integer;
elems: setof byte;
ok, is_col: boolean;
begin
s := 0;
for i := 1to n do s := s + i;
ok := true;
for is_col := false to true dobegin
i := 1;
while (i <= n) and ok dobegin
sum := 0; elems := [];
for j := 1to n dobeginif is_col then value := a[j, i]
else value := a[i, j];
sum := sum + value;
elems := elems + [value];
end;
ok := ((sum = s) and (elems = [1 .. n]));
inc(i);
end;
end;
if ok then writeln('Yes')
else writeln('No');
end.
-=BR@BUS=-
8.12.2006 3:27
ВОТ СПАСИБО!!!
-=BR@BUS=-
15.12.2006 22:02
А как сделать без "set of byte" а то мне нельзя с ней. И если можно немного разъяснить принцип роботы этой программы...
Malice
16.12.2006 2:53
А вот так попробуй:
var i,j:integer;
b:boolean;
begin
b:=true;
for i:=0to n-1dofor j:=0to n-1do
b:=b and (((i*(n+1)+j) mod n)+1=a[j+1,i+1]);
if b then writeln ('ok');
end.
-=BR@BUS=-
16.12.2006 4:46
Вот такую матрицу 1 2 3 2 3 1 3 1 2 программа распознаёт, а вот эту 1 2 3 3 1 2 2 3 1 уже не распознаёт...
Malice
16.12.2006 5:03
Может по тому, что это совсем другая матрица, заполненная по другому принципу ?
-=BR@BUS=-
16.12.2006 16:05
Но ведь эта матрица тоже является латинским квадратом
volvo
16.12.2006 16:34
Цитата
А как сделать без "set of byte" а то мне нельзя с ней.
Вот так:
const(*
n = 4;
a: array[1 .. n, 1 .. n] of integer = (
(1, 2, 3, 4),
(2, 3, 4, 1),
(3, 4, 1, 2),
(4, 1, 2, 3)
);
*)
n = 3;
a: array[1 .. n, 1 .. n] of integer = (
(1, 2, 3),
(3, 1, 2),
(2, 3, 1)
);
type{ Это - вместо того множества, которое было раньше }
vector = array[1 .. n] of integer;
var
elems: vector;
value, i, j, k, s, sum, check: integer;
ok, is_col: boolean;
begin
s := 0;
{
Вначале считаем сумму, которая должна получаться в каждом столбце/строке
(согласно определению латинского квадрата)
}for i := 1to n do s := s + i;
ok := true; { изначально считаем, что все в порядке }{ вначале (is_col = false) проходим по строкам, потом (когда is_col = true) - по столбцам }for is_col := false to true dobegin
i := 1;
{
здесь цикл заменен на While, чтобы при нахождении ошибки сразу же
закончить просмотр строк/столбцов, если была хоть одна ошибка, то это - уже
НЕ латинский квадрат
}while (i <= n) and ok dobegin
sum := 0; { обнуляем сумму для данной строки/столбца, и наше "псевдомножество" }for k := 1to n do elems[k] := 0;
for j := 1to n dobegin{
теперь выбираем текущий элемент (в зависимости от того, со строками
или столбцами мы работаем, индексы меняются местами)
}if is_col then value := a[j, i]
else value := a[i, j];
{ добавляем элемент к текущей сумме строки/столбца }
sum := sum + value;
{
если элемент находится в допустимых границах (1 .. N)
и до этого в данном столбце/строке еще не встречался,
то записываем его, как уже встреченный, иначе - ошибка
(либо одно и то же число встречается в строке больше одного раза,
либо число больше N или меньше единицы, что тоже недопустимо)
}if (value > 0) and (value <= n) and (elems[value] = 0) then
inc(elems[value])
else ok := false;
end;
{ Ну, и проверяем еще сумму на ошибочность - отличается ли она от "эталонной" }
ok := (ok and (sum = s));
inc(i);
end;
end;
if ok then writeln('Yes')
else writeln('No');
end.
Вот и все... Так устроит?
-=BR@BUS=-
21.12.2006 23:05
Вот чё в итоге у меня получилось, но программа всегда отвечает НЕТ
Program Lat_kv;
Uses crt;
type
vector = array[1 .. 100] of integer;
var
elems: vector;
n,value, i, j, k, s, sum, check: integer;
ok, is_col: boolean;
A:Array[1..100,1..100] of integer;
begin
clrscr;
Writeln ('Введите ранг матрицы');
readln (n);
Writeln ('Введите элементы матрицы через <ENTER>');
For i:=1to n doFor j:=1to n do
readln (a[i,j]);
s := 0;
for i := 1to n do s := s + i;
ok := true;
for is_col := false to true dobegin
i := 1;
while (i <= n) and ok dobegin
sum := 0;
for k := 1to n do elems[k] := 0;
for j := 1to n dobeginif is_col then value := a[j, i]
else value := a[i, j];
sum := sum + value;
if (value > 0) and (value <= n) and (elems[value] = 0) then
inc(elems[value])
else ok := false;
end;
ok := (ok and (sum = s));
inc(i);
end;
end;
if ok then writeln('Yes')
else writeln('No');
readln;
end;
end.
ПОЧЕМУ???
volvo
21.12.2006 23:08
Я тебе привел рабочую программу, которая давала правильный ответ... Ты ее исправлял? Тогда чего спрашиваешь? Разбирайся, ЧТО, ГДЕ и, главное, ЗАЧЕМ исправлял?
-=BR@BUS=-
21.12.2006 23:13
Мне нужно чтобы матрица вводилась во время выполнения программы, а не чтобы она была задана в конст.
мисс_граффити
21.12.2006 23:30
не умеешь писать ввод матрицы?
volvo
21.12.2006 23:34
sum := 0; { обнуляем сумму для данной строки/столбца, и наше "псевдомножество" }for k := 1to n do elems[k] := 0; { <--- Вот эту строку, например ... }
... я, по-твоему, для красоты напечатал? По какому праву ты ее убрал, и как хочешь, чтобы программа БЕЗ нее правильно работала?
-=BR@BUS=-
21.12.2006 23:43
Как всегда => верно volvo
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.