Quadrado mágico
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
precisava verificar a matriz para ver se não há numeros repetidos, pois se caso tiver vai dar quadrado magico, mas não vai ser, tentei fazer isso jogando os dados da matriz num vetor, mas não fica muito funcional , porque se caso a matriz foi muito grande tamanho 100 por exemplo o vetor sera 100*100 e ficara enorme tudo isso, se achar um logica que não precise de um vetor, dai complementa esse código
Se for preciso que o número seja repetido em todas as posições para dar o quadrado mágico, então basta comparar o uma posição com outra para saber: mat[0][0] = mat[0][1].
Caso contrário eu faria uma função que retorna quantas vezes um determinado passado por parâmetro aparece na matriz. Depois percorreria a matriz chamando essa função para cada valor da matriz. Se a função retornar um valor maior do que 1 significa que o número repetiu em alguma posição.
Resposta:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, j, n, soma, soma2, ** mat;
printf(“Digite a ordem da matriz, numero de colunas MxM 3×3 conforme ex:\n”);
scanf(“%d”, &n);
while (n < 1) {
printf(“Digite novamente a ordem da matriz:\n”);
scanf(“%d”, &n);
}
mat = (int**)malloc(sizeof(int*) * n);
if (mat == NULL) {
printf(“Problema na alocacao da matriz\n”);
return(-1);
}
for (i = 0; i < n; i++) {
mat[i] = (int*)malloc(sizeof(int) * n);
if (mat[i] == NULL) {
printf(“Problema na alocacao da matriz\n”);
return(-1);
}
}
printf(“Digite o elementos da matriz ex 8 0 7:\n”);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf(“%d”, &(mat[i][j]));
}
}
soma = 0;
for (j = 0; j < n; j++) {
soma = soma + mat[0][j];
}
for (i = 1; i < n; i++) {
soma2 = 0;
for (j = 0; j < n; j++) {
soma2 = soma2 + mat[i][j];
}
if (soma != soma2) {
printf(“A matriz nao e um quadrado magico\n”);
return(1);
}
}
for (j = 0; j < n; j++) {
soma2 = 0;
for (i = 0; i < n; i++) {
soma2 = soma2 + mat[i][j];
}
if (soma != soma2) {
printf(“A matriz nao e um quadrado magico\n”);
return(1);
}
}
soma2 = 0;
for (i = 0; i < n; i++) {
soma2 = soma2 + mat[i][i];
}
if (soma != soma2) {
printf(“A matriz nao e um quadrado magico\n”);
return(1);
}
soma2 = 0;
for (i = 0; i < n; i++) {
soma2 = soma2 + mat[i][n – (i + 1)];
}
if (soma != soma2) {
printf(“A matriz nao e um quadrado magico\n”);
return(1);
}
printf(“A matriz e um quadrado magico\n”);
for (i = 0; i < n; i++) {
free(mat[i]);
mat[i] = NULL;
}
free(mat);
mat = NULL;
return(1);
}
Exemplo de um quadrado magico.
Explicação:
Achei na net,
if (testaL && testaC && somaDP == somaDS && somaDP == vetL[0]) {
printf(“Quadrado magico”);
nessa parte do código eu não entendi porquê na comparação a soma da diagonal principal é == vetL[0]. E porquê armazenou um zero dentro do vetor linha?
Estou no início de linguagem C, você poderia me indicar se possível algum vídeo, livro que auxilie no desenvolvimento desse programa, por favor?
Sua questão é realmente muito boa. Eu considerei que, se o vetL possui todas as linhas com o mesmo valor (a primeira parte do if faz isso), então qualquer das linhas é a mesma coisa (eu acabei pegando a linha zero). Eu poderia pegar o vetC já que ele também terá as somas iguais.
Para um curso introdutório do C eu recomendo meu material da playlist: https://www.youtube.com/playlist?list=PLyCB0KujIBc9pRdEABwxPM4I81Ptd5Poi