Sunteți pe pagina 1din 6

#include <stdio.

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

struct nodoArbol {
struct nodoArbol *ptrIzq;
int mat[3][3];
int dato;
struct nodoArbol *prtDer;
struct nodoArbol *prtArr;
struct nodoArbol *prtAbj;
};

typedef struct nodoArbol NodoArbol; /* sinónimo de la estructura nodoArbol */


typedef NodoArbol *ptrNodoArbol; /* sinónimo de NodoArbol* */

/* prototipos */
//void insertaNodo(ptrNodoArbol *ptrArbol, int valor);
void insertaNodo(ptrNodoArbol *ptrArbol, int valor, int mat [3][3]);
void inOrden(ptrNodoArbol ptrArbol);
void preOrden(ptrNodoArbol ptrArbol);
void postOrden(ptrNodoArbol ptrArbol);
void printMat(ptrNodoArbol ptrArbol);
//void printMat(int mat [3][3]);
int terminado(int tab2 [3][3]);
int mover(int matt[3][3],int r, int x, int y);

/* la función main comienza la ejecución del programa */


int main()

//srand(time(NULL));
//printf("Los números colocados en el arbol son:\n");

/*Crea la matriz de inicio*/


int matt[3][3]={{3,7,1},{9,0,2},{4,6,5}};
printf("Matriz Principal:\n");
printMat(matt);

/* inserta valores al azar entre 1 y 15 en el árbol */


for (i = 1; i <= 10; i++) {
elemento = rand() % 15;
printf("%3d", elemento);
insertaNodo(&ptrRaiz, elemento);
for (i = 1; i <= 30; i++) {
insertaNodo(&ptrRaiz, 0,matt);
}

/* recorre el árbol en preorden */


printf("\n\nEl recorrido en preorden es:\n");
preOrden(ptrRaiz);
// printf("\n\nEl recorrido en preorden es:\n");
// preOrden(ptrRaiz);

/* recorre el árbol en in inorden */


printf("\n\nEl recorrido inorden es:\n");
inOrden(ptrRaiz);
// printf("\n\nEl recorrido inorden es:\n");
// inOrden(ptrRaiz);
/* recorre el árbol en postOrden */
printf("\n\nEl recorrido en postOrden es:\n");
postOrden(ptrRaiz);
printf("\n");
// printf("\n\nEl recorrido en postOrden es:\n");
// postOrden(ptrRaiz);
// printf("\n");

return 0;
}

/* inserta un nodo dentro del árbol */


void insertaNodo( ptrNodoArbol *ptrArbol, int valor )
void insertaNodo( ptrNodoArbol *ptrArbol, int valor, int mat [3][3] )
{
/* si el árbol está vacÃo */
if (*ptrArbol == NULL) {
if (*ptrArbol != NULL) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = valor;
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
(*ptrArbol)->mat[3][3];
(*ptrArbol)->dato = valor;
(*ptrArbol)->ptrIzq = NULL;
(*ptrArbol)->prtDer = NULL;
(*ptrArbol)->prtArr = NULL;
(*ptrArbol)->prtAbj = NULL;
} else {
printf("no se inserto %d. No hay memoria disponible.n", valor);
}
} else {
/* el dato a insertar es menor que el dato en el nodo actual */
if (valor < (*ptrArbol)->dato) {
insertaNodo(&((*ptrArbol)->ptrIzq), valor);
} else if (valor > (*ptrArbol)->dato) {
insertaNodo(&((*ptrArbol)->prtDer), valor);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
int x,y;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (mat[i][j]==0) {
x=i;
y=j;
break;
}
}
}
if (mover(mat,4,x,y)==1) {
// printf("inside4\n");
mat[x][y]=mat[x][y-1];
mat[x][y-1]=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
insertaNodo(&((*ptrArbol)->ptrIzq), 4,mat);
}else {
// printf("dup");
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (mat[i][j]==0) {
x=i;
y=j;
break;
}
}
}
if (mover(mat,2,x,y)==1) {
// printf("inside2\n");
mat[x][y]=mat[x][y+1];
mat[x][y+1]=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
insertaNodo(&((*ptrArbol)->prtDer), 2,mat);
}else {
// printf("dup");
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (mat[i][j]==0) {
x=i;
y=j;
break;
}
}
}
if (mover(mat,3,x,y)==1) {
// printf("inside3\n");
mat[x][y]=mat[x-1][y];
mat[x-1][y]=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
insertaNodo(&((*ptrArbol)->prtArr), 3,mat);
} else {
// printf("dup");
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (mat[i][j]==0) {
x=i;
y=j;
break;
}
}
}
if (mover(mat,1,x,y)==1) {
// printf("inside1\n");
mat[x][y]=mat[x+1][y];
mat[x+1][y]=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
(*ptrArbol)->mat[i][j] = mat[i][j];
}
}
insertaNodo(&((*ptrArbol)->prtAbj), 1,mat);
} else {
printf("dup");
// printf("dup");
}
}
}
if (ptrArbol != NULL) {
inOrden(ptrArbol->ptrIzq);
printf("%3d", ptrArbol->dato);
printMat(ptrArbol);
printMat(ptrArbol->mat);
inOrden(ptrArbol->prtDer);
inOrden(ptrArbol->prtArr);
inOrden(ptrArbol->prtAbj);
}
}

/* si el árbol no está vacÃo, entonces recórrelo */


if (ptrArbol != NULL) {
printf("%3d", ptrArbol->dato);
printMat(ptrArbol);
printMat(ptrArbol->mat);
preOrden(ptrArbol->ptrIzq);
preOrden(ptrArbol->prtDer);
preOrden(ptrArbol->prtArr);
preOrden(ptrArbol->prtAbj);
}
}

if (ptrArbol != NULL) {
postOrden(ptrArbol->ptrIzq);
postOrden(ptrArbol->prtDer);
postOrden(ptrArbol->prtArr);
postOrden(ptrArbol->prtAbj);
printf("%3d", ptrArbol->dato);
printMat(ptrArbol);
printMat(ptrArbol->mat);
}
}
/*Impresion de la matriz recibida dentro del puntero*/
void printMat(ptrNodoArbol ptrArbol){
/*Recibe una matriz de 3x3 para despues imprimirla con formato*/
void printMat(int mat [3][3]){
printf("\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%3d",ptrArbol->mat[i][j]);
printf("%3d",mat[i][j]);
}
printf("\n");
}
printf("\n");
}
}

/*Compara la matriz para saber si ya termino.*/


int terminado(int tab2 [3][3]){
int tab[3][3]={{1,2,3},{4,5,6},{7,8,0}};
int ban=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (tab[i][j]==tab2[i][j]) {
ban++;
}
}
}
if (ban==9) {
return 1;
}
return 0;
}
/*Revisa si el movimiento es posible*/
int mover(int matt [3][3],int r, int x, int y){
if(terminado(matt)){
printMat(matt);
}
// printf("x: %d, y: %d\n",x,y );
switch(r){
case 1:
if (x+1<3) {/*abajo*/
return 1;
}else{
return 0;
}
break;
case 2:
if (y+1<3) {/*derecha*/
return 1;
}else{
return 0;
}
break;
case 3:
if (x-1>=0) {/*arriba*/
return 1;
}else{
return 0;
}
break;
case 4:
if (y-1>=0) {/*izquierda*/
return 1;
}else{
return 0;
}
break;
}
return 0;
}

S-ar putea să vă placă și