Uma matriz quadrada inteira é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais.
Por exemplo, a matriz abaixo é um quadrado mágico:
Faça um algoritmo que recebe uma dimensão N de uma matriz Anxn, seguido dos respectivos valores da matriz (preenchendo a matriz de cima para baixo, da esquerda para a direta), verificar se A é um quadrado mágico (escrevendo “quadrado magico” caso seja e “quadrado nao magico” caso não seja).
Solução em linguagem C
#include <stdio.h>
int main(void) {
int n, i, j;
scanf("%i", &n);
int mat[n][n];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%i", &mat[i][j]);
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%i ", mat[i][j]);
}
printf("\n");
}
int somaDP = 0, somaDS = 0;
//soma diagonal principal
for (i = 0; i < n; i++) {
somaDP += mat[i][i];
}
//soma diagonal secundária
for (i = 0; i < n; i++) {
somaDS += mat[i][n-i-1];
}
//soma linhas
printf("\nSoma das linhas: ");
int vetL[n];
for (i = 0; i < n; i++) {
vetL[i] = 0;
for (j = 0; j < n; j++) {
vetL[i] += mat[i][j];
}
}
for (i = 0; i < n; i++) {
printf("%i ", vetL[i]);
}
//soma colunas
printf("\nSoma das colunas: ");
int vetC[n];
for (j = 0; j < n; j++) {
vetC[j] = 0;
for (i = 0; i < n; i++) {
vetC[j] += mat[i][j];
}
}
for (i = 0; i < n; i++) {
printf("%i ", vetC[i]);
}
printf("\nSoma diagonal principal %i e secundária %i\n", somaDP, somaDS);
int testaL = 1, testaC = 1;
for (i = 1; i < n; i++) {
if (vetL[i] != vetL[i-1]) {
testaL = 0;
break;
} else if (vetC[i] != vetC[i-1]) {
testaC = 0;
break;
}
}
if (testaL && testaC && somaDP == somaDS && somaDP == vetL[0]) {
printf("Quadrado magico");
} else {
printf("Quadrado nao magico");
}
return 0;
}
Link: http://ideone.com/5mdOha
Solução em C utilizando funções
#include <stdio.h>
void lerMatriz(int tam, int mat[tam][tam]) {
int i, j;
for (i = 0; i < tam; i++) {
for (j = 0; j < tam; j++) {
scanf("%i", &mat[i][j]);
}
}
}
void mostraMatriz(int tam, int mat[tam][tam]) {
int i, j;
for (i = 0; i < tam; i++) {
for (j = 0; j < tam; j++) {
printf("%i ", mat[i][j]);
}
printf("\n");
}
}
int somaDiagonalPrincipal(int tam, int mat[tam][tam]) {
int i, soma = 0;
for (i = 0; i < tam; i++) {
soma += mat[i][i];
}
return soma;
}
int somaDiagonalSecundaria(int tam, int mat[tam][tam]) {
int i, soma = 0;
for (i = 0; i < tam; i++) {
soma += mat[i][tam-i-1];
}
return soma;
}
void mostraVetor(int vet[], int tam) {
int i;
for (i = 0; i < tam; i++) {
printf("%i ", vet[i]);
}
}
void somaLinhas(int tam, int mat[tam][tam], int vet[]) {
int i, j;
for (i = 0; i < tam; i++) {
vet[i] = 0;
for (j = 0; j < tam; j++) {
vet[i] += mat[i][j];
}
}
}
void somaColunas(int tam, int mat[tam][tam], int vet[]) {
int i, j;
for (j = 0; j < tam; j++) {
vet[j] = 0;
for (i = 0; i < tam; i++) {
vet[j] += mat[i][j];
}
}
}
int testaIgualidadeVetor(int vet[], int tam) {
int i;
for (i = 1; i < tam; i++) {
if (vet[i] != vet[i-1]) {
return 0;
}
}
return 1;
}
int main(void) {
int n;
scanf("%i", &n);
int mat[n][n];
lerMatriz(n, mat);
mostraMatriz(n, mat);
int somaDP = 0, somaDS = 0;
somaDP = somaDiagonalPrincipal(n,mat); //soma da diagonal principal
somaDS = somaDiagonalSecundaria(n,mat); //soma da diagonal secundaria
//soma linhas
int vetL[n];
somaLinhas(n, mat, vetL);
printf("\nSoma das linhas: ");
mostraVetor(vetL, n);
//soma colunas
int vetC[n];
somaColunas(n, mat, vetC);
printf("\nSoma das colunas: ");
mostraVetor(vetC, n);
printf("\nSoma diagonal principal %i e secundaria %i\n", somaDP, somaDS);
int testaL, testaC;
testaL = testaIgualidadeVetor(vetL, n);
testaC = testaIgualidadeVetor(vetC, n);
if (testaL && testaC && somaDP == somaDS && somaDP == vetL[0]) {
printf("Quadrado magico");
} else {
printf("Quadrado nao magico");
}
return 0;
}
Link: http://ideone.com/PNwlnY
Casos de teste para o Laboratório Virtual de Programação
case = teste1 input = 3 8 0 7 4 5 6 3 10 2 output = Quadrado magico case = teste2 input = 3 8 0 7 4 5 6 3 10 3 output = Quadrado nao magico case = teste3 input = 3 2 9 4 7 5 3 6 1 8 output = Quadrado magico case = teste4 input = 4 1 14 15 4 12 7 6 9 8 11 10 5 13 2 3 16 output = Quadrado magico case = teste5 input = 4 0 14 15 4 12 6 6 9 8 11 1 5 13 2 3 1 output = Quadrado nao magico