Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Quadrado Mágico


Cawe Coy

Pergunta

Olá,

sou novo aqui e estou com uma dúvida, se alguém puder me ajudar, ficarei grato!

Meu professor de Álgebra Linear me mandou fazer um programa que encontre a solução para o quadrado mágico, sendo que todas as seqüências somadas deve dar 15.

Usei uma lógica pouco otimizada, eu sei, eu tive problemas de como numerar o vetor "y[]" de 1 à 9 sem repetição. Mas o maior problema não é esse agora.

Veja, fiz as anotações no código:

#include <stdlib.h>
#include<time.h>

main()
{    
    int mat[2][2],x,y[8],a1,a2,a3,a4;
    
    srand(time(NULL));
    
    do{
        
        y[0]=10;
        y[1]=11;
        y[2]=12;
        y[3]=13;
        y[4]=14;
        y[5]=15;
        y[6]=16;
        y[7]=17;
        y[8]=18;
    
        do
        {
        
            y[0]=rand()%10;
            y[1]=rand()%10;
            y[2]=rand()%10;
            y[3]=rand()%10;
            y[4]=rand()%10;
            y[5]=rand()%10;
            y[6]=rand()%10;
            y[7]=rand()%10;
            y[8]=rand()%10;
            
            }while( ( (y[1]==y[2]) || (y[1]==y[3]) || (y[1]==y[4]) || (y[1]==y[5]) || (y[1]==y[6]) || (y[1]==y[7]) || (y[1]==y[8]) || (y[1]==y[0]) || (y[2]==y[3]) || (y[2]==y[4]) || (y[2]==y[5]) || (y[2]==y[6]) || (y[2]==y[7]) || (y[2]==y[8]) || (y[2]==y[0]) || (y[3]==y[4]) || (y[3]==y[5]) || (y[3]==y[6]) || (y[3]==y[7]) || (y[3]==y[8]) || (y[3]==y[0]) || (y[4]==y[5]) || (y[4]==y[6]) || (y[4]==y[7]) || (y[4]==y[8]) || (y[4]==y[0]) || (y[5]==y[6]) || (y[5]==y[7]) || (y[5]==y[8]) || (y[5]==y[0]) || (y[6]==y[7]) || (y[6]==y[8]) || (y[6]==y[0]) || (y[7]==y[8]) || (y[7]==y[0]) || (y[8]==y[0]) ) || ( (y[1]==0)  || (y[2]==0)  || (y[3]==0)  || (y[4]==0)  || (y[5]==0)  || (y[6]==0)  || (y[7]==0)  || (y[8]==0)  || (y[0]==0) ) ); // y[] não pode ser zero, e nunca pode repetir os valores.

        mat[0][0]=y[0];
        mat[0][1]=y[1];
        mat[0][2]=y[2];//2 //y[2] e y[3] estão saindo da condição do while diferentes (compile e veja),
        mat[1][0]=y[3];//3 //mas depois de serem transferidos pra matriz, são forçados a serem iguais, não sei como!
        mat[1][1]=y[4];
        mat[1][2]=y[5];//5 //y[5] e y[6] estão saindo da condição do while diferentes (compile e veja),
        mat[2][0]=y[6];//6 //mas depois de serem transferidos pra matriz, são forçados a serem iguais, não sei como!
        mat[2][1]=y[7];
        mat[2][2]=y[8];

        a1=mat[0][0]+mat[1][1]+mat[2][2];
        a2=mat[0][2]+mat[1][1]+mat[2][0];
        a3=mat[0][1]+mat[1][1]+mat[2][1];
        a4=mat[1][0]+mat[1][1]+mat[1][2];

        }while( (a1!=15) || (a2!=15) || (a3!=15) || (a4!=15) );
        
    printf("\n\n\t%d %d %d\n\n\t%d %d %d\n\n\t%d %d %d\n\n\n\n",y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8]);
        
    printf("\n\n\t%d %d %d\n\n\t%d %d %d\n\n\t%d %d %d\n\n\n\n",mat[0][0],mat[0][1],mat[0][2],mat[1][0],mat[1][1],mat[1][2],mat[2][0],mat[2][1],mat[2][2]); 
              
    system("pause");
        
}

// Se alguém conhecer alguma forma mais eficiente de preencer o vetor y[] sem repetição, por favor me ajudem. E me ajudem entender o erro (comentado no código).

Grato! (:

Cawe Coy R.M.

Editado por Jonathan Queiroz
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

O erro tá acontecendo por esse motivo: em C e C++, quando você declara um vetor você coloca o número de elementos que ele vai ter, mas na hora de acessar esses elementos, comece contando do 0.

Ex: mat[2]; //dois elementos: mat[0] e mat[1] ... mat[2] é inválido, e se usar ele vai dar erro.

Então no seu código, o mat precisa ser declarado como mat[3][3].

Além disso, faça o seu codigo trabalhar por você.

Isso:

y[0]=10;
 y[1]=11;
 y[2]=12;
 y[3]=13;
 y[4]=14;
 y[5]=15;
 y[6]=16;
 y[7]=17;
 y[8]=18;
é igual a isso:
for(n=0; n<9; n++) y[n] = n + 10;
E isso:
y[0]=rand()%10;
y[1]=rand()%10;
y[2]=rand()%10;
y[3]=rand()%10;
y[4]=rand()%10;
y[5]=rand()%10;
y[6]=rand()%10;
y[7]=rand()%10;
y[8]=rand()%10;
é igual a isso:
for(n=0; n<9; n++) y[n] = rand()%10 + 1; //+1 pra não ser 0 nunca
Esse while
while( ( (y[1]==y[2]) || (y[1]==y[3]) || (y[1]==y[4]) || (y[1]==y[5]) || (y[1]==y[6]) || (y[1]==y[7]) || (y[1]==y[8]) || (y[1]==y[0]) || (y[2]==y[3]) || (y[2]==y[4]) || (y[2]==y[5]) || (y[2]==y[6]) || (y[2]==y[7]) || (y[2]==y[8]) || (y[2]==y[0]) || (y[3]==y[4]) || (y[3]==y[5]) || (y[3]==y[6]) || (y[3]==y[7]) || (y[3]==y[8]) || (y[3]==y[0]) || (y[4]==y[5]) || (y[4]==y[6]) || (y[4]==y[7]) || (y[4]==y[8]) || (y[4]==y[0]) || (y[5]==y[6]) || (y[5]==y[7]) || (y[5]==y[8]) || (y[5]==y[0]) || (y[6]==y[7]) || (y[6]==y[8]) || (y[6]==y[0]) || (y[7]==y[8]) || (y[7]==y[0]) || (y[8]==y[0]) ) || ( (y[1]==0)  || (y[2]==0)  || (y[3]==0)  || (y[4]==0)  || (y[5]==0)  || (y[6]==0)  || (y[7]==0)  || (y[8]==0)  || (y[0]==0) ) );
Pode ser substituído com dois laços for:
int repete; //declara antes essa variavel de controle
...

   {
    ...
    repete = 0;

    for(m=0; m<9; m++)
        for(n=0; n<9; n++)
            if(y[m] == y[n]) repete = 1;
    
    }while( repete );
mat[0][0]=y[0];
        mat[0][1]=y[1];
        mat[0][2]=y[2];
        mat[1][0]=y[3];
        mat[1][1]=y[4];
        mat[1][2]=y[5];
        mat[2][0]=y[6];
        mat[2][1]=y[7];
        mat[2][2]=y[8];
igual a isso:
x = 0;
for (m=0; m<3; m++)
    for (n=0; n<3; n++)
        mat[m][n] = x++;

É isso, espero que tenha ajudado.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, só uma correção...

Onde eu escrevi isso:

for(m=0; m<9; m++)
        for(n=0; n<9; n++)
            if(y[m] == y[n]) repete = 1;
Você troca por isso:
for(m=0; m<9; m++)
        for(n=0; n<9; n++)
            if(y[m] == y[n] && m != n) repete = 1;

Senão ia ficar preso no while pra sempre.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...