• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Латинский Квадрат

  • Автор темы KOMPNET
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

KOMPNET

Латинский квадрат. Латинским квадратом пордка n называется квадратная таблица размером nxn каждая строка и каждый столбец которой содержит все числа от 1 до n. Проверить является ли заданная целочисленная матрица латинским квадратом. Я так понимаю в этой задаче три этапа: проверка введенных данных (действительно ли квадрат), действительно ли числа в матрице от 1 до n, сравнение элементов строк и столбцов чтобы они не были равны. Но как это реализовать, вообще массивы плохо понимаю, а задачу нужно сделать...
 
W

Whatka

не мог бы ты пояснить условие.
как собственно задаётся матрица?
считываешь с файла,пользователь сам вводит её размерность и элементы,вводит тоько размерность или как по другому?
 
K

KOMPNET

Пользователь вводит сам матрицу, предварительно введя размерность N
 
W

Whatka

Суть в том что тебе нужно посчиитать произведение каждой строки и каждого столбца
они все должны равняться n!(от 1 до n идут числа)

Добавлено: +к этому надо ввести прверку на число 1


пример
1 2 3
3 1 2
2 3 1

1 1 6
6 1 1
1 6 1


понятно?
 
K

KOMPNET

Второй пример не правильный, числа должны быть от 1 до n Если матрица размером 3на 3 то и числа в ней 123

Добавлено:
C++:
#include <stdio.h>
#include <conio.h>
void main()
{ int n,j,i;
int A[100][100];
printf("Vvedite razmer massiva n: ");
scanf("%d",&n);
printf("Vvedite elementy massiva\n");
for (i=0; j<n; i++)
for (j=0; j<n; j++)
scanf("%d",A[i][j]);

вот мое начало помоги с продолжением
 
W

Whatka

Второй пример не правильный, числа должны быть от 1 до n Если матрица размером 3на 3 то и числа в ней 123

:facepalm:

я её специально написал показывая что в ней призведение = 6 во всех строках и столбцах,но там по две 1
тебе нужно проверку написать на единицы
 
W

Whatka

C++:
int i(0),j,s,p,fact(1);
while(i!=n)
{
fact=i*fact;
i++;
}
for(j=0;j<N;j++)
{
s=1;p=0;
for(i=0;i<N;i++)
{
p=A[j][i];
s=p*s;
}
if(s!=fact)
cout<<"Ne latinski kvadr";
break;
}
вот проверка произведений на единицы проверку сам напишешь
 
W

Whatka

а сам не нашёл??


просто строки поменяй в факториале:
while(i!=n)
{
i++;
fact=i*fact;
}
 
W

Whatka

нет всё правильно
надо проверять произведения
+
какое-то условие (доплнительно) :facepalm: условие на повторяющиеся цифры для каждой строки наверно

для каждой т.к.

1 2 3 4
1 3 4 2
1 4 2 3
24 1 1 1
 
R

rrrFer

Whatka
если в строке четное число отрицательных чисел - то квадрат полюбому не латинский, но ваша программа и тут сбой даст.
А так-то да, ваш алгоритм спасает то, что по условию матрица целочисленная
но вам не кажется что проще в каждом столбце и каждой строке последовательно искать числа от 1 до n чем произведение, и еще выполнять кучу проверок.

Замечу, что поиск повторяющихся чисел это весьма трудоемкий процесс ))
 
W

Whatka

Соглашусь,что куча проверок и подсчёт произведения трудоёмкий процесс

но мне кажется для решения этой задачи существует более простой и короткий
способ чем в каждом столбце и каждой строке последовательно искать числа от 1 до n.
 
R

rrrFer

Whatka
есть подозрение что достаточно проверять сумму и произведение :angry2:
типа A*B = C*D, A+B = C+D <=> A=C, B=D ИЛИ A=D, B=C
вроде бы
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!