Ayuda urgente en c.

Cerrado
jorge - Modificado el 21 jul 2019 a las 00:45
misterdekus Mensajes enviados 473 Fecha de inscripción miércoles, 10 de enero de 2018 Estatus Miembro Última intervención miércoles, 27 de julio de 2022 - 26 jul 2019 a las 07:49
Hola,

tengo un problema al imprimir la matriz me sale dos números iguales, no debe ser así solo se que tal ves sea las variables "p" y "a" causan el problema. El programa trata de un rompecabezas de matriz de 4*4 los elementos de la matriz va desde el 1 al 15, y el ultimo elemento debe ser 0 y con ese cero desordenar la matriz y luego que el jugador ordene la matriz.
Normalmente el numero que se repite es el 4.
|1||2||3||4|
|5||6||7||8|
|9||10||11||12|
|4||14||15||0|
pero asi debe quedar.
|1||2||3||4|
|5||6||7||8|
|9||10||11||12|
|13||14||15||0|
El codigo es este.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int mat[4][4];
int h,c,b,p,a;
void main ()
{
int x,z,e;
srand(time(NULL));
for (x= 1; x<=4; x++)
{
for (z= 1; z<=4; z++)
{
e=e+1;
mat[x][z]=e;
if (e==16)
{
mat[x][z]=0;
}
}
}
/*----------------------------------*/

for (b=0; b<3; b++)
{
for (x=1; x<=4; x++)
{
for (z=1; z<=4; z++)
{
if (mat[x][z]==0)
{
p=x;
a=z;
}
}
}

/*----------------------------------*/
if (p==4 && a==4)
{
c=rand()%2+1;
if (c==1)
{
int intercambio1();
}
else
{
intercambio2();
}
}
if (p>1 && p<4 && a<4 && a>1)
{
c=rand()%4+1;
switch(c)
{
case 4:
intercambio4();
break;
case 3:
intercambio3();
break;
case 2:
intercambio2();
break;
case 1:
intercambio1();
break;
default:
printf("ERROR if1\n");
break;
}
}
if (p==4 && a>1 && a<4)
{
c=rand()%3+1;
switch(c)
{
case 3:
intercambio3();
break;
case 2:
intercambio2();
break;
case 1:
intercambio1();
break;
default:
printf("ERROR if2\n");
break;
}
}
if (p==1 && a>1 && a<4)
{
c=rand()%3+1;
switch(c)
{
case 3:
intercambio3();
break;
case 2:
intercambio4();
break;
case 1:
intercambio1();
break;
default:
printf("ERROR if3\n");
break;
}
}
if (p>1 && p<4 && a==1)
{
c=rand()%3+1;
switch(c)
{
case 3:
intercambio2();
break;
case 2:
intercambio3();
break;
case 1:
intercambio4();
break;
default:
printf("ERRORf4\n");
break;
}
}
if (p>1 && p<4 && a==4)
{
c=rand()%3+1;
switch(c)
{
case 3:
intercambio4();
break;
case 2:
intercambio2();
break;
case 1:
intercambio1();
break;
default:
printf("ERRORf5\n");
break;
}
}
if (p==1 && a==1)
{
c=rand()%2+1;
switch(c)
{
case 2:
intercambio3();
break;
case 1:
intercambio4();
break;
default:
printf("ERRORf6\n");
break;
}
}
if (p==1 && a==4)
{
c=rand()%2+1;
switch(c)
{
case 2:
intercambio1();
break;
case 1:
intercambio4();
break;
default:
printf("ERRORf7\n");
break;
}
}
if (p==4 && a==1)
{
c=rand()%2+1;
switch(c)
{
case 2:
intercambio3();
break;
case 1:
intercambio2();
break;
default:
printf("ERRORf8\n");
break;
}
}
}
/*----------------------------------*/
for (x=1;x<=4;x++)
{
for (z=1;z<=4;z++)
{
printf ("|%i|",mat[x][z]);
}
printf("\n");
}

}
/*----------------------------------*/
void intercambio1()
{
int aux;
aux=mat[p][a-1];
mat[p][a-1]=mat[p][a];
mat[p][a]=aux;
}
void intercambio2()
{
int aux;
aux=mat[p-1][a];
mat[p-1][a]=mat[p][a];
mat[p][a]=aux;
}
void intercambio3()
{
int aux;
aux=mat[p][a+1];
mat[p][a+1]=mat[p][a];
mat[p][a]=aux;
}
void intercambio4()
{
int aux;
aux=mat[p+1][a];
mat[p+1][a]=mat[p][a];
mat[p][a]=aux;
}

1 respuesta

misterdekus Mensajes enviados 473 Fecha de inscripción miércoles, 10 de enero de 2018 Estatus Miembro Última intervención miércoles, 27 de julio de 2022 127
26 jul 2019 a las 07:49
ahmm si pasamos por alto que no estas declarando las funciones void

no me gusta que estés leyendo o asignar un valor una matriz 4x4 mal

para leer/asignar un valor una matriz de N filas o/y columnas ,

se lee de 0 a N-1

y no de 1 a N

así que primero modifica los FOR que en el que lees la matriz

y basicamente podria ser la solucion a tu problema

Saludos
0