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:

quadradomagico

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
Share

5 opiniões sobre “Quadrado mágico

  1. felipe motta

    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

     
    Reply
    1. Benjamin Grando Moreira

      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.

       
      Reply
  2. felipe

    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,

     
    Reply
  3. ADRIANE

    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?

     
    Reply
    1. Benjamin Grando Moreira

      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

       
      Reply

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.