Intercambiar elementos de lugar en una matriz

Iniciado por binaryum, 25 Julio 2010, 06:42 AM

0 Miembros y 1 Visitante están viendo este tema.

binaryum

Hola que tal , pues mi duda es esa tengo que hacer un "puzzle" de numeros para que el usuario los ordene en forma creciente y el espacio en blanco quede en la esquina inferior derecha ...

Esto es lo que llevo hasta ahora .

Esta hecho en Dev c++ , pero es C .



#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define  TAM 12
void ordenado (int,int,int M[TAM][TAM]);
void desordenar (int,int,int M[TAM][TAM]);
void jugar (int,int,int M[TAM][TAM]);
main ()
{
 int u=0;
 int i,x,a=1,menu;
 int M[TAM][TAM];
 int columnas,filas;

 do
 {
 printf ("Introduzca las filas de la matriz:  ");
 scanf  ("%d",&filas);
 if(filas<3 || filas>12)
       {
           printf("\nError. El orden debe estar entre 3 y 12");
           getch();
           system("cls");
       }
 }
 while (filas<3 || filas>12);
 
 do
 {
 printf ("\nIntroduzca las columnas de la matriz: ");
 scanf  ("%d",&columnas);
   if(columnas<3 || columnas>12)
   {
           printf("\nError. El orden debe estar entre 3 y 12");
           getch();
           system("cls");
       }
 }
 while (columnas<3 || columnas >12);
 
 
ordenado (filas,columnas,M);
   printf ("\n\n");
   desordenar (filas,columnas,M);
   jugar (filas,columnas,M);


getch ();
}
//-------------------------------------------------------------------------------
void ordenado (int filas,int columnas, int M[TAM][TAM])
{
  int i,x,a=1;;
 for (i=0;i<filas;i++)
   {
 for (x=0;x<columnas;x++)  
{  
               if ((i==filas-1) && (x==columnas-1))
{
 M[i][x]=0;      
       }
       else
{
                 M[i][x]=a;
 a++;
               }  
           }
}

  for (i=0;i<filas;i++)
  {
   
    printf ("\n");
    for (x=0;x<columnas;x++)
 {    if ((i==filas-1) && (x==columnas-1))
      {
printf ("%4c",' ');  
              }
              else
              printf ("%4d",M[i][x]);
               
 }
 printf ("\n");
  }
 
}
//--------------------------------------------------------------------------------  

void desordenar (int filas,int columnas,int M[TAM][TAM])

{
     srand (time(NULL));
    int i,x,g,temp,y;
    temp = (filas*columnas)-1;
    for(i=0; i<filas; i++)
   {
     for(g=0; g<columnas; g++)
     {
       M[i][g] = 0;
     }
   }
   
   for(i=1; i<=temp; i++)
  {
     do
    {
     y = rand() % filas;
     x = rand() % columnas;
    }
    while(M[y][x]);
    M[y][x]=i;
  }
     printf("\n");  
    for(i=0; i<filas; i++)
    {
      for(g=0; g<columnas; g++)
      {
        if (M[i][g]==0)
        {
      printf ("%4c",' ');  
        }
        else
        {
          printf("%4d",M[i][g]);
        }
      }
        printf("\n\n");
    }
}


//-----------------------------------------------------------------------
void jugar(int filas, int columnas, int M[TAM][TAM])
{
   int movimiento=0;
   int auxFila=0;
   int auxColumna=0;
   int aux=0;
   int aux2=0;
   double tiempoTotal=0;

   printf("\n\n");
   do
   {
 
   
       for(int x=0; x<filas; x++)
       {
           for(int y=0; y<columnas; y++)
           {
               if(M[x][y]==0)
               {
                   printf("  \t");
                   auxFila=x;
                   auxColumna=y;
               }
               else
               {
                   printf("%d\t",M[x][y]);
               }
           }
           printf("\n\n");                    
       }
       
       do
       {
           movimiento=getch();
       }while((movimiento!=72)&&(movimiento!=75)&&(movimiento!=77)&&(movimiento!=80));
       
       switch(movimiento)
       {
           case 72:
           {
               if(auxFila+1==filas)
               {
                   printf("Movimiento Invalido");
                   getch();
               }
               
               else
               {
                   aux2=auxFila+1;
                   aux=M[auxFila][auxColumna];
                   M[auxFila][auxColumna]=M[aux2][auxColumna];
                   M[aux2][auxColumna]=aux;
               }
               break;
           }
           
           case 77:
           {
               if(auxColumna-1==-1)
               {
                   printf("Movimiento Invalido");
                   getch();
               }
               
               else
               {
                   aux2=auxColumna-1;
                   aux=M[auxFila][auxColumna];
                   M[auxFila][auxColumna]=M[auxFila][aux2];
                   M[auxFila][aux2]=aux;
               }
               break;
           }
           
           case 75:
           {
               if(auxColumna+1==columnas)
               {
                   printf("Movimiento Invalido");
                   getch();
               }
               
               else
               {
                   aux2=auxColumna+1;
                   aux=M[auxFila][auxColumna];
                   M[auxFila][auxColumna]=M[auxFila][aux2];
                   M[auxFila][aux2]=aux;
               }
               break;
           }

           case 80:
           {
               if(auxFila-1==-1)
               {
                   printf("Movimiento Invalido");
                   getch();
               }
               else
               {
                   aux2=auxFila-1;
                   aux=M[auxFila][auxColumna];
                   M[auxFila][auxColumna]=M[aux2][auxColumna];
                   M[aux2][auxColumna]=aux;
               }
               break;
           }
       }
       system("cls");
   } while(!ordenado(filas,columnas,M));
   
   printf("\nFelicidades has ganado!!!!");
}



Cuando trato de compilar me da este error

in function void jugar (int,int,int(*)[12])
could no convert ordenado (filas,columnas,M) to bool
in argument to unary !

Por favor hay alguien que me pueda ayudar ?

do-while

¡Buenas!

El problema esta en la definicion de la funcion ordenado:

void ordenado (int filas,int columnas, int M[TAM][TAM])
{
   int i,x,a=1;;
  for (i=0;i<filas;i++)
    {
  for (x=0;x<columnas;x++)    
{   
                if ((i==filas-1) && (x==columnas-1))
{
  M[i][x]=0;       
        }
        else
{
                  M[i][x]=a;
  a++;
                }    
            }
}

   for (i=0;i<filas;i++)
   {

       printf ("\n");
       for (x=0;x<columnas;x++)
  {    if ((i==filas-1) && (x==columnas-1))
       {
printf ("%4c",' ');    
               }
               else
                printf ("%4d",M[i][x]);

  }
  printf ("\n");
   }

}


Que es de tipo void, y la has definido para inicializar la matriz, pero luego, al parecer estas intentando utilizarla para comprobar si se ha terminado el juego, lo cual no es correcto.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

binaryum

Tienes razón. Y entonces me ayudarías con alguna condición para comprobar si el juego esta hecho ? por favor , no se me ocurre más nada

do-while

¿¿¿¿¿¿¿Como???????

Estoy emepezando a pensar que este codigo no lo has escrito tu. Si lo hubieses echo, sabrias perfectamente que es lo que tienes que hacer para corregirlo, ya que es bien sencillo (solo requiere cambiar un sentencia y añadir una funcion). En la explicacion que te he dado antes tambien se encuentra la solucion.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

mk_137

Cita de: binaryum en 25 Julio 2010, 16:22 PM
Tienes razón. Y entonces me ayudarías con alguna condición para comprobar si el juego esta hecho ? por favor , no se me ocurre más nada
xDDD
para no ocurrirsete nada te has currado el programa...