// File: jenniferdr[P]proyectoIAI/basepatrones.cc
// Function: llenarBDPat(bool*, char*, unsigned char*)
void llenarBDPat(bool set[16], int8 inicial[16], unsigned char bd[]) {

  NodoPat* nodo_inicial = new NodoPat();
  memcpy(&(nodo_inicial->estado), inicial, 16*sizeof(int8));
  nodo_inicial->movimientos = 0;
  nodo_inicial->posicion_cero = 0;

  bd[compactar(inicial, set)] = 0;

  std::queue<NodoPat*> cola;
  cola.push(nodo_inicial);

  int nodos_expandidos = 0;

  int movs[4] = {-4,-1,1,4};

  while (!cola.empty()) {
    NodoPat* nodo = cola.front();
    cola.pop();

    nodos_expandidos++;

    for (int i = 0; i < 4; i++) {

      if (puedeMoverse(movs[i], nodo->posicion_cero)) {

	int8 temp[16];
	memcpy(&temp, &(nodo->estado), 16*sizeof(int8));

	char ficha = temp[nodo->posicion_cero + movs[i]];
	temp[nodo->posicion_cero] = ficha;
	temp[nodo->posicion_cero + movs[i]] = 0;
	if ( bd[compactar(temp, set)] == 255 ) {
	  NodoPat* hijo = new NodoPat();
	  memcpy(&(hijo->estado), &temp, 16*sizeof(int8));
	  hijo->posicion_cero = nodo->posicion_cero + movs[i];
	  hijo->movimientos = nodo->movimientos + (ficha > 0 ? 1 : 0);
	  bd[compactar(temp, set)] = hijo->movimientos;
	  cola.push(hijo);
	} else {
	  unsigned char val1 = bd[compactar(temp, set)];
	  unsigned char val2 = nodo->movimientos + (ficha > 0 ? 1 : 0);
	  bd[compactar(temp, set)] = val1 < val2 ? val1 : val2;
	}
      }
    }
    delete nodo;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl $0x12, %edi
callq 0x21b0
xorps %xmm0, %xmm0
movaps %xmm0, (%rax)
movw $0x0, 0x10(%rax)
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movups (%rcx), %xmm0
movups %xmm0, (%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x10(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x11(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x10(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x8500
movl %eax, %ecx
movq -0xd8(%rbp), %rax
movslq %ecx, %rcx
movb $0x0, (%rax,%rcx)
leaq -0x70(%rbp), %rdi
movq %rdi, -0xd0(%rbp)
callq 0x8f30
movq -0xd0(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x8f60
jmp 0x86e9
movl $0x0, -0x80(%rbp)
movq 0x3919(%rip), %rax      # 0xc010
movq %rax, -0x90(%rbp)
movq 0x3913(%rip), %rax      # 0xc018
movq %rax, -0x88(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x8f90
movb %al, -0xd9(%rbp)
jmp 0x871d
movb -0xd9(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x872e
jmp 0x8a58
leaq -0x70(%rbp), %rdi
callq 0x8fb0
movq %rax, -0xe8(%rbp)
jmp 0x8740
movq -0xe8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x8fd0
jmp 0x875c
movl -0x80(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x80(%rbp)
movl $0x0, -0x9c(%rbp)
cmpl $0x4, -0x9c(%rbp)
jge 0x8a2e
movslq -0x9c(%rbp), %rax
movl -0x90(%rbp,%rax,4), %edi
movq -0x98(%rbp), %rax
movsbl 0x11(%rax), %esi
callq 0x85c0
testb $0x1, %al
jne 0x87a3
jmp 0x8a18
movq -0x98(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0xb0(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xa8(%rbp)
movq -0x98(%rbp), %rax
movsbl 0x11(%rax), %eax
movslq -0x9c(%rbp), %rcx
addl -0x90(%rbp,%rcx,4), %eax
cltq
movb -0xb0(%rbp,%rax), %al
movb %al, -0xb1(%rbp)
movb -0xb1(%rbp), %cl
movq -0x98(%rbp), %rax
movsbq 0x11(%rax), %rax
movb %cl, -0xb0(%rbp,%rax)
movq -0x98(%rbp), %rax
movsbl 0x11(%rax), %eax
movslq -0x9c(%rbp), %rcx
addl -0x90(%rbp,%rcx,4), %eax
cltq
movb $0x0, -0xb0(%rbp,%rax)
movq -0x18(%rbp), %rax
movq %rax, -0xf0(%rbp)
leaq -0xb0(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x8500
movl %eax, %ecx
movq -0xf0(%rbp), %rax
movslq %ecx, %rcx
movzbl (%rax,%rcx), %eax
cmpl $0xff, %eax
jne 0x8957
movl $0x12, %edi
callq 0x21b0
movq %rax, -0xf8(%rbp)
jmp 0x886c
movq -0xf8(%rbp), %rax
xorps %xmm0, %xmm0
movaps %xmm0, (%rax)
movw $0x0, 0x10(%rax)
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movaps -0xb0(%rbp), %xmm0
movups %xmm0, (%rax)
movq -0x98(%rbp), %rax
movzbl 0x11(%rax), %eax
movslq -0x9c(%rbp), %rcx
movl -0x90(%rbp,%rcx,4), %ecx
addl %ecx, %eax
movb %al, %cl
movq -0xc0(%rbp), %rax
movb %cl, 0x11(%rax)
movq -0x98(%rbp), %rax
movzbl 0x10(%rax), %eax
movsbl -0xb1(%rbp), %ecx
testl %ecx, %ecx
setg %cl
movzbl %cl, %ecx
addl %ecx, %eax
movb %al, %cl
movq -0xc0(%rbp), %rax
movb %cl, 0x10(%rax)
movq -0xc0(%rbp), %rax
movb 0x10(%rax), %al
movb %al, -0x101(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x8(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x8500
movb -0x101(%rbp), %dl
movl %eax, %ecx
movq -0x100(%rbp), %rax
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
leaq -0x70(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
callq 0x8f60
jmp 0x8938
jmp 0x8a16
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x8ff0
jmp 0x8a6a
movq -0x18(%rbp), %rax
movq %rax, -0x110(%rbp)
leaq -0xb0(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x8500
movl %eax, %ecx
movq -0x110(%rbp), %rax
movslq %ecx, %rcx
movb (%rax,%rcx), %al
movb %al, -0xc1(%rbp)
movq -0x98(%rbp), %rax
movzbl 0x10(%rax), %eax
movsbl -0xb1(%rbp), %esi
xorl %ecx, %ecx
movl $0x1, %edx
cmpl $0x0, %esi
cmovgl %edx, %ecx
addl %ecx, %eax
movb %al, -0xc2(%rbp)
movzbl -0xc1(%rbp), %eax
movzbl -0xc2(%rbp), %ecx
cmpl %ecx, %eax
jge 0x89ce
movb -0xc1(%rbp), %al
movb %al, -0x111(%rbp)
jmp 0x89da
movb -0xc2(%rbp), %al
movb %al, -0x111(%rbp)
movb -0x111(%rbp), %al
movb %al, -0x121(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x120(%rbp)
leaq -0xb0(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x8500
movb -0x121(%rbp), %dl
movl %eax, %ecx
movq -0x120(%rbp), %rax
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
jmp 0x8a18
jmp 0x8a1a
movl -0x9c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x9c(%rbp)
jmp 0x876f
movq -0x98(%rbp), %rax
movq %rax, -0x130(%rbp)
cmpq $0x0, %rax
je 0x8a53
movq -0x130(%rbp), %rdi
movl $0x12, %esi
callq 0x21c0
jmp 0x870c
leaq -0x70(%rbp), %rdi
callq 0x8ff0
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
movq -0x78(%rbp), %rdi
callq 0x2320
nopw %cs:(%rax,%rax)