Algoritmos e programação

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
Sair da versão mobile