Jump to content

Quadrado mágico N*N


thinkabout

Recommended Posts

Boa Tarde,

O exercício inicial era para um quadrado 3*3, contudo segue uma versão mais genérica para N*N (sem ser o user a fazer input).

Ideias para possíveis melhoramento no código.

http://pt.wikipedia.org/wiki/Quadrado_m%C3%A1gico

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define x 3

/*
Um quadrado mágico é uma matriz 3×3 contendo valores entre 1 e 9 (sem repetições), de tal
forma que a soma dos elementos de qualquer uma das linhas, colunas e diagonais é sempre igual.

A figura seguinte mostra um exemplo de um quadrado mágico:
6 1 8
7 5 3 
2 9 4

Desenvolva uma função que verifique se uma matriz 3×3 passada como argumento é um
quadrado mágico. A função devolve 1 se isso se verificar ou 0 no caso contrário.

http://pt.wikipedia.org/wiki/Quadrado_m%C3%A1gico
*/

int g0e08(int matriz[x][x]) {

   int linha[x], coluna[x];
   int i, j, diagonalprincipal = 0, diagonalsecundaria=0;

   // Faz a impressão do quadrado
   for (i = 0; i<x; i++) {
       for (j = 0; j < x; j++) {
           printf("%d\t", matriz[i][j]);
       }
       printf("\n");
   }

   // Faz a soma das duas diagonais
   for (i = 0; i<x; i++) {
       for (j = 0; j<x; j++) {
           if (i == j) diagonalprincipal += matriz[i][j];
           if (x - 1 == (x - 1)-j)    diagonalsecundaria += matriz[i][j]; 
           /* Última posição mais a esquerda (x - 1) e conforme vou 
              andando nas colunas vou decrementado uma coluna de forma 
              que ele vai subindo as linhas (percorrer a diagonal ao contrário)
              O x-1 é porque o tamanho do array começa em 0 e não em 1*/
       }
   }

   //printf("\nValor da diagonalprincipal -> %d e o valor da diagonalsecundaria -> %d \n", diagonalprincipal, diagonalsecundaria);

   if (diagonalprincipal != diagonalsecundaria) { // Se as diagonais forem diferentes não é quadrado mágico.
       return 0;
   }

   // Vou fazer as somas
   for (i = 0; i<x; i++) {
       linha[i] = 0;
       coluna[i] = 0;
       for (j = 0; j<x; j++) {
           linha[i]  += matriz[i][j]; //soma linhas
           coluna[i] += matriz[j][i]; //soma da colunas (inversão de linha por colunas)        
       }

       if (linha[i] != coluna[i]) {
           return 0;
       }

       //printf("\n Valor da soma das linhas %d", linha[i]);
       //printf("\n Valor da soma das linhas %d", coluna[i]);
   }

   return 1;
}


void main(){
   int matriz[x][x] = { { 6, 1, 8 }, { 7, 5, 3 }, { 2, 9, 4 } }; // Quadrado magico 3*3
   //int matriz[x][x] = { { 4, 14,15,1 }, { 9,7 ,6,12 }, { 5,11,10,8 }, { 16,2 ,3,13 } };

   int verifica;

   verifica = g0e08(matriz);

   if (verifica == 0) puts("\nNao e um quadrado magico");
   else puts("\nE quadrado magico");

}
Edited by thinkabout
Link to comment
Share on other sites

sendo assim, um código mais arrumado, minimizado e com um bug corrigido :

#include <stdio.h>

#define SIZE 3

int g0e08(int matrix[size][size]) {
   int rcount = 0, ccount = 0;
   int d1count = 0, d2count = 0;

   // somar as diagonais
   for (int i = 0; i < SIZE; ++i) {
       d1count += matrix[i][i];
       d2count += matrix[i][size - i - 1];
   }

   // verificar se a soma é gual
   if (d1count != d2count)
       return 0;

   // somar as linhas e colunas
   for (int i = 0; i < SIZE; ++i) {
       rcount = ccount = 0;
       // soma da linha e coluna "i"
       for (int j = 0; j < SIZE; ++j) {
           rcount += matrix[i][j];
           ccount += matrix[j][i];
       }

       // verificar se as somas são iguais
       if (rcount != ccount || rcount != d1count)
           return 0;
   }

   return 1;
}

void print_matrix(int matrix[size][size]) {
   for (int row = 0; row < SIZE; ++row) {
       for (int column = 0; column < SIZE; ++column)
           printf("%d ", matrix[row][column]);
       printf("\n");
   }
   printf("\n");
}

int main(void) {
   int matrix[size][size] = { { 6, 1, 8 },
                              { 7, 5, 3 },
                              { 2, 9, 4 } };

   print_matrix(matrix);

   if (g0e08(matrix) == 0)
       printf("Nao e um quadrado magico\n");
   else
       printf("E quadrado magico\n");

     return 0;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.