Algorithm


Problem Name: 2 AD-HOC - beecrowd | 2327

Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2327

beecrowd | 2327

Quadrados

Por OBI - Olimpíada Brasileira de Informática 2007 BR Brazil

Timelimit: 1

 

Chama-se de quadrado mágico um arranjo, na forma de um quadrado, de N × N números inteiros tal que todas as linhas, colunas e diagonais têm a mesma soma.

Por exemplo, o quadrado abaixo

2 7 6
9 5 1
4 3 8

é um quadrado mágico de soma 15, pois todas as linhas (2 + 7 + 6 = 15, 9 + 5 + 1 = 15 e 4 + 3 + 8 = 15), colunas (2 + 9 + 4 = 15, 7 + 5 + 3 = 15 e 6 + 1 + 8 = 15) e diagonais (2 + 5 + 8 = 15 e 6 + 5 + 4 = 15) têm a mesma soma (15).

Escreva um programa que, dado um quadrado, determine se ele é magico ou não e qual a soma dele (caso seja mágico).

 

Entrada

 

A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrão (normalmente o teclado). A primeira linha da entrada de cada caso de teste contém um inteiro N (2 < N < 10). As N linhas seguintes contêm N inteiros cada, separados por exatamente um espaço em branco. Os inteiros dentro do quadrado são todos maiores que 0 (zero) e menores que 1.000.

 

Saída

 

Seu programa deve imprimir, na saída padrão, uma única linha com um inteiro representando a soma do quadrado mágico ou −1 caso o quadrado não seja mágico.

 

 

 

Exemplos de Entrada Exemplos de Saída

3
2 7 6
9 5 1
4 3 8

15

 

 

 

3
1 2 3
4 5 6
7 8 9

-1

Code Examples

#1 Code Example with C++ Programming

Code - C++ Programming


#include <cstdio>
#define MAX_N 1000
int main() {
    int matriz[MAX_N][MAX_N];
    int soma1[MAX_N], soma2[MAX_N];
    int ordem, i, j, diagonal1 = 0, diagonal2 = 0;
    scanf("%d", &ordem);
    for (i = 0; i  <  ordem; i++) {
        for (j = 0; j  <  ordem; j++) {
            int davez;
            scanf("%d", &davez);
            matriz[i][j] = davez;
            soma1[i] = soma1[i] + matriz[i][j];
            soma2[j] = soma2[j] + matriz[i][j];
            if (i == j) diagonal1 += davez;
            if (i + j + 1 == ordem) diagonal2 += davez;
        }
    }
    int referencia = soma1[0];
    for (i = 0; i  <  ordem; i++) {
        if (soma1[i] != referencia || soma2[i] != referencia) {
            printf("-1\n");
            return 0;
        }
    }
    if (diagonal1 != referencia || diagonal2 != referencia) {
        printf("-1\n");
        return 0;
    }
    printf("%d\n", referencia);
    return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
3
1 2 3
4 5 6
7 8 9

Output

x
+
cmd
-1

#2 Code Example with Python Programming

Code - Python Programming


def magico(mat) :
   n = len(mat)
   sumd1=sumd2=0
   for i in range(n):
      sumd1+=mat[i][i]
      sumd2+=mat[i][n-i-1]
   if not(sumd1==sumd2):return False
   for i in range(n):
      sumr=0
      sumc=0
      for j in range(n):
         sumr+=mat[i][j]
         sumc+=mat[j][i]
      if not(sumr==sumc==sumd1):return False
   return True
n=int(input())
matriz=[]
for i in range(n):
   x=list(map(int,input().split()))
   matriz.append(x)
print(sum(x)) if magico(matriz) else print(-1)
Copy The Code & Try With Live Editor

Input

x
+
cmd
3
2 7 6
9 5 1
4 3 8

Output

x
+
cmd
15
Advertisements

Demonstration


Previous
#2326 Beecrowd Online Judge Solution 2326 Sacoleiro Solution in C, C++, Java, Js and Python
Next
#2328 Beecrowd Online Judge Solution 2328 Chocolate Solution in C, C++, Java, Js and Python