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

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

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

KOMPNET

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

rrrFer

Не уверен что верно, но обещаю пряник тому, кто подберет набор исходных данных, на которых результат будет неверным:
Код:
#include <fstream>

int main() {
int n, **a, fact, vs, i, j, s1, s0, p0, p1;

std ::ifstream ifst( "input.txt" );
std ::ofstream ofst( "output.txt" );

ifst >> n;

a = new int*[ n ];
for( i = 0; i < n; i ++ ) {
a[ i ] = new int[ n ];
for( j = 0; j < n; j ++ )
ifst >> a[ i ][ j ];
}

fact = 1;
for( i = 1; i <= n; i ++ )
fact *= i;
vs = ( (1 + n) / 2. ) * n;

for( i = 0; i < n; i ++ ) {
s0 = s1 = 0;
p1 = p0 = 1;
for( j = 0; j < n; j ++ ) {
s0 += a[ i ][ j ];
p0 *= a[ i ][ j ];
s1 += a[ j ][ i ];
p1 *= a[ j ][ i ];
}
if( s0 != vs || s1 != vs || p1 != fact || p0 != fact )
break;
}

ofst << ( i == n ? "yes" : "no" );

for( i = 0; i < n; i ++ )
delete[] a[i];
delete[] a;

ifst .close();
ofst .close();

return 0;
}

ну ясно, что в файле должны быть "корректные" данные, т.е. в первой строке целое число - размерность квадратный матрицы(N), затем N*N целых чисел - собственно матрица.

N неотрицательное, все числа в диапазоне от INT_MIN до INT_MAX
 
L

lazybiz

все числа в диапазоне от INT_MIN до INT_MAX
Ой зря ты это сказал... Щасс я докапаюсь) Если, скажем, один из элементов матрицы будет равен INT_MAX, то как произведение поместится например в p0 ??=)
 
W

Whatka

вот мой вариант(через сумму и произведение :D ):


C++:
#include<iostream>
using namespace std;
void main(){
int q,n,i(0),j,s,p,fact(1),sum(0),r(0),e(0);
cout<<"n=";
cin>>n;
q=n*n;
int **m;
m =new int*[q];
cout<<"Vvedi matr:\n";
for (i=0;i<n;i++)						
{			
m[i]=new int[n];			
for (j=0;j<n;j++)			
cin>>m[i][j];		
}	
cout<<endl<<"Matr:";
for (i=0;i<n;i++)						
{			
cout<<endl;			
for (j=0;j<n;j++)			
cout<<" "<<m[i][j];		
}	
cout<<endl;
i=0;
while(i!=n)
{
i++;
fact=i*fact;
sum=i+sum;	//можно через прогрессию посчитать
}
cout<<"fact&sum:"<<fact<<" "<<sum<<endl;
for(j=0;j<n;j++)
{
s=1;p=0;r=0;
for(i=0;i<n;i++)
{
e=m[j][i];
p=m[j][i];
s=p*s;
r=r+e;
}
if((s!=fact)||(r!=sum))
{
q=0;
cout<<"Ne latinski kvadrat"<<endl;
break;
}
}
if(q!=0)
cout<<"Latinski kvadrat"<<endl;
}
 
G

Guest

вот здесь есть все программы для работы с подсчетами

сам долго искал эту программу весь инет облазил
 
R

rrrFer

САНЕК
сайт по ссылке вроде годный и красивый, но ИМХО тут реклама запрещена(или должна согласовываться с администрацией)
Whatka
память освободи. Тебе самому такое форматирование нравится? ;)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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