// File: /workspace/github_cpp_makefile_star2_O2/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movq %rdx, %rbx
movq %rsi, %r15
movq %rdi, %r14
pushq $0x12
popq %rdi
callq 0x2180
leaq 0x30(%rsp), %r12
movq %rax, (%r12)
movups (%r15), %xmm0
movups %xmm0, (%rax)
andw $0x0, 0x10(%rax)
movq %r15, %rdi
movq %r14, 0x20(%rsp)
movq %r14, %rsi
callq 0x397c
cltq
movb $0x0, (%rbx,%rax)
leaq 0x38(%rsp), %r15
movq %r15, %rdi
callq 0x3ef4
movq %r15, %rdi
movq %r12, %rsi
callq 0x4146
leaq 0x25ac(%rip), %r15      # 0x6020
movq %rbx, 0x18(%rsp)
movq 0x48(%rsp), %rax
cmpq %rax, 0x68(%rsp)
je 0x3b94
movq (%rax), %rbp
leaq 0x38(%rsp), %rdi
callq 0x437a
xorl %r13d, %r13d
cmpq $0x10, %r13
je 0x3b84
movl (%r13,%r15), %r14d
movsbl 0x11(%rbp), %edx
leal (%r14,%rdx), %eax
cmpl $0xf, %eax
ja 0x3b7b
movslq %edx, %rcx
cmpb $0xc, %cl
ja 0x3aed
movzbl %dl, %edx
movl $0x888, %esi            # imm = 0x888
btl %edx, %esi
jb 0x3ae3
movl $0x1110, %esi           # imm = 0x1110
btl %edx, %esi
jae 0x3aed
cmpq $0x4, %r13
jne 0x3aed
jmp 0x3b7b
cmpq $0x8, %r13
je 0x3b7b
movups (%rbp), %xmm0
movaps %xmm0, (%rsp)
movl %eax, %eax
movb (%rsp,%rax), %bl
movb %bl, (%rsp,%rcx)
movb $0x0, (%rsp,%rax)
movq %rsp, %rdi
movq 0x20(%rsp), %rsi
callq 0x397c
movslq %eax, %r12
movq 0x18(%rsp), %rsi
movb (%rsi,%r12), %al
cmpb $-0x1, %al
je 0x3b37
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movzbl %cl, %ecx
movzbl %al, %edx
cmpb %cl, %al
cmovael %ecx, %edx
movb %dl, (%rsi,%r12)
jmp 0x3b7b
pushq $0x12
popq %rdi
callq 0x2180
movq %rax, 0x28(%rsp)
andw $0x0, 0x10(%rax)
movaps (%rsp), %xmm0
movups %xmm0, (%rax)
addb 0x11(%rbp), %r14b
movb %r14b, 0x11(%rax)
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movb %cl, 0x10(%rax)
movq 0x18(%rsp), %rax
movb %cl, (%rax,%r12)
leaq 0x38(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x4146
addq $0x4, %r13
jmp 0x3a99
movq %rbp, %rdi
pushq $0x12
popq %rsi
callq 0x2190
jmp 0x3a79
leaq 0x38(%rsp), %rdi
callq 0x3f10
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x3bb2
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x3f10
movq %rbx, %rdi
callq 0x2280