Algorithm
Problem Name: 2 AD-HOC - beecrowd | 2327
Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2327
Quadrados
Por OBI - Olimpíada Brasileira de Informática 2007 Brazil
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 |
15 |
3 |
-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
1 2 3
4 5 6
7 8 9
Output
#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
2 7 6
9 5 1
4 3 8
Output