elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  rompecabezas imposible
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: rompecabezas imposible  (Leído 2,237 veces)
rached1

Desconectado Desconectado

Mensajes: 1


Ver Perfil
rompecabezas imposible
« en: 26 Enero 2018, 07:52 am »

hola
tengo que programar el rompecabezas imposible en C de tal modo de que me quede una matriz 3 x 3 con números del 1 al 8 ordenados de manera aleatoria y que el lugar que le corresponde al nueve este vació, para después poder mover el espacio en blanco para ir acomodando los números.

3  2  5
8  1  6
7  4

el problema que tengo es que ya genero la matriz 3 x 3 ordenada de manera aleatoria con un espacio en blanco que se puede mover, pero no logro hacer que ese espacio en blanco sea el nueve ya que aveces toma otro numero.

1  8  6
9  5  7
2  4 

¿como podría hacerle para que el nueve siempre sea el espacio en blanco?

#include<stdio.h>
#include <time.h>
#include <windows.h>
 
bool verifica(int matriz[3][3], int i, int j, int nume){
   for(i = 0; i < 3; i++){
   for(j = 0; j < 3; j++){
      if(nume == matriz[j]){
         return false;
      }
   }
}
return true;
}

void imprimir_matriz();
 
int matriz[3][3];
int x= 2 ,y =2;
 
int main()   {
      int i, j, num;
   char caracter,enter;
   
   
srand(time(0));

for(i = 0; i < 3; i++){
   for(j = 0; j < 3; j++){
      num = 1 + rand() % 9;
      while(verifica(matriz, 3,3, num) == false){
         num = 1 + rand() % 9;
      }
      matriz[j] = num;
   }
}

for(i = 0; i < 3; i++){
   for(j = 0; j < 3; j++){
      if(matriz[j] != 0)   {
         
            
   }
}
printf("\n");
}
   matriz[y]
  • = 0;
   imprimir_matriz();
   do   {
      caracter = getchar();
      enter = getchar();
      switch(caracter)   {
         case 'w':   //arriba
            if(y <= 1)   {
               //Movimiento de ficha
               matriz[y]
  • = matriz[y+1]
  • ;
               matriz[y+1]
  • = 0;
               imprimir_matriz();
               y++;
            }
            else   {
               printf("Fuera de los limites\n");
            }
         break;
         case 's':   //abajo
            if(y >= 1)   {
               //Movimiento de ficha
               matriz[y]
  • = matriz[y-1]
  • ;
               matriz[y-1]
  • = 0;
               imprimir_matriz();
               y--;
            }
            else   {
               printf("Fuera de los limites\n");
            }
         break;
         case 'a':   //izquierda
            if(x <= 1)   {
               //Movimiento de ficha
               matriz[y]
  • = matriz[y][x+1];
               matriz[y][x+1] = 0;
               imprimir_matriz();
               x++;
            }
            else   {
               printf("Fuera de los limites\n");
            }
 
         break;
         case 'd':   //derecha
            if(x >= 1)   {
               matriz[y]
  • = matriz[y][x-1];
               matriz[y][x-1] = 0;
               imprimir_matriz();
               x--;
            }
            else   {
               printf("Fuera de los limites\n");
            }
         break;
         case '0':   //Salida
         break;
         default:
            printf("Caracter Incorrecto");
         break;
      }
      printf("Caracter : %c\n",caracter);
   }while(caracter != '0');
   return 0;
}
 
void imprimir_matriz()   {
   int i = 0,j;
   
   while(i < 3)   {
      j = 0;
      while(j < 3)   {
         if(matriz[j] != 0)   {
            printf("[%2i]",matriz[j]);
         }
         else   {
            printf("[  ]");
         }
         j++;
      }
      printf("\n");
      i++;
   }   
}


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: rompecabezas imposible
« Respuesta #1 en: 26 Enero 2018, 12:17 pm »

Mete el código entre estas dos etiquetas:
[code=c] copia aquí todo tu código [/code]
Si no lo hace así ves que no se va a entender.


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: rompecabezas imposible
« Respuesta #2 en: 26 Enero 2018, 15:52 pm »

Los números aleatorios debes elegirlos entre el rango 1-8... así no te saldrá nunca el 9.

Para evitar que los números salgan repetidos una y otra vez, procede de esta manera:

Primeor se meten en la 'bolsa' los números que se van a rifar:
Código:
Array de enteros = funcion RellenarArray(entero cantidad, entero Inicio)
    entero k
    array de enteros Ar

    bucle para k desde Inicio a (Cantidad + Inicio)
        Ar(k) = k 
    fin bucle
fin funcion

Y luego se barajan, así el reparto es aleatorio:

Código:
funcion Barajar(Array de enteros Ar, entero Cantidad)
    entero i, j, k

    Bucle para k desde cantidad-1 hasta 1 retrocediendo
        j = random(ente 0 y k)
        i = Ar(j)
        Ar(j) = Ar(k)
        Ar(k) = i
fin bucle


Con cada nueva partida, tu harás dos llamadas, antes que nada:
Código:
   Ar = Rellenararray(8, 1)
   Barajar(Ar, 8)
   //....colocar en sus casillas
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Rompecabezas con el Sonido
Multimedia
LorD_QetzaL 6 4,630 Último mensaje 11 Noviembre 2009, 22:34 pm
por LorD_QetzaL
El rompecabezas de la Stasi
Noticias
wolfbcn 1 1,867 Último mensaje 21 Junio 2013, 10:30 am
por -- KiLiaN --
Rompecabezas numerico
Programación C/C++
erickgracia 3 3,346 Último mensaje 9 Agosto 2014, 23:44 pm
por ivancea96
¿Imposible? Juego de Rompecabezas imposible
Programación C/C++
AlbertoBSD 4 5,354 Último mensaje 23 Julio 2016, 18:54 pm
por AlbertoBSD
Un 'rompecabezas' matemático de primaria deja perplejos a los padres:¿Es capaz..
Noticias
wolfbcn 0 1,183 Último mensaje 15 Mayo 2018, 02:10 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines