// File: /workspace/github_cpp_makefile_star2_O1/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 %rdx, 0x10(%rsp)
movq %rsi, %r15
movq %rdi, %r14
movl $0x12, %edi
callq 0x2180
movq %rax, 0x18(%rsp)
xorl %ecx, %ecx
movw %cx, 0x10(%rax)
movups (%r15), %xmm0
movups %xmm0, (%rax)
movw %cx, 0x10(%rax)
movq %r15, %rdi
movq %r14, 0x78(%rsp)
movq %r14, %rsi
callq 0x37f8
cltq
movb $0x0, (%rbx,%rax)
xorps %xmm0, %xmm0
leaq 0x20(%rsp), %r15
movaps %xmm0, 0x40(%r15)
movaps %xmm0, 0x30(%r15)
movaps %xmm0, 0x20(%r15)
movaps %xmm0, 0x10(%r15)
movaps %xmm0, (%r15)
movq %r15, %rdi
xorl %esi, %esi
callq 0x3ec2
movq 0x30(%r15), %rax
movq 0x40(%r15), %rcx
addq $-0x8, %rcx
cmpq %rcx, %rax
je 0x391e
movq 0x18(%rsp), %rcx
movq %rcx, (%rax)
addq $0x8, 0x50(%rsp)
jmp 0x3aa0
leaq 0x20(%rsp), %rdi
leaq 0x18(%rsp), %rsi
callq 0x4038
jmp 0x3aa0
movq (%rax), %rbp
movq 0x40(%rsp), %rcx
addq $-0x8, %rcx
cmpq %rcx, %rax
je 0x3949
addq $0x8, %rax
jmp 0x397b
movq 0x38(%rsp), %rdi
movl $0x200, %esi            # imm = 0x200
callq 0x2190
movq 0x48(%rsp), %rax
leaq 0x8(%rax), %rcx
movq %rcx, 0x48(%rsp)
movq 0x8(%rax), %rax
movq %rax, 0x38(%rsp)
leaq 0x200(%rax), %rcx
movq %rcx, 0x40(%rsp)
movq %rax, 0x30(%rsp)
leaq 0x2699(%rip), %r13      # 0x6020
xorl %r12d, %r12d
movl (%r13), %r15d
movsbl 0x11(%rbp), %ecx
leal (%r15,%rcx), %eax
cmpl $0xf, %eax
ja 0x3a7d
movslq %ecx, %rcx
leal -0x3(%rcx), %edx
cmpb $0x9, %dl
ja 0x39c8
movzbl %dl, %edx
movl $0x333, %esi            # imm = 0x333
btl %edx, %esi
jae 0x39c8
leaq 0x272a(%rip), %rsi      # 0x60e8
cmpq (%rsi,%rdx,8), %r12
je 0x3a7d
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 0x78(%rsp), %rsi
callq 0x37f8
movslq %eax, %r14
movq 0x10(%rsp), %rsi
movb (%rsi,%r14), %al
cmpb $-0x1, %al
je 0x3a12
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movzbl %cl, %ecx
movzbl %al, %edx
cmpb %cl, %al
cmovael %ecx, %edx
movb %dl, (%rsi,%r14)
jmp 0x3a7d
movl $0x12, %edi
callq 0x2180
movq %rax, 0x80(%rsp)
movw $0x0, 0x10(%rax)
movaps (%rsp), %xmm0
movups %xmm0, (%rax)
addb 0x11(%rbp), %r15b
movb %r15b, 0x11(%rax)
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movb %cl, 0x10(%rax)
movq 0x10(%rsp), %rdx
movb %cl, (%rdx,%r14)
movq 0x50(%rsp), %rcx
movq 0x60(%rsp), %rdx
addq $-0x8, %rdx
cmpq %rdx, %rcx
je 0x3a6b
movq %rax, (%rcx)
addq $0x8, 0x50(%rsp)
jmp 0x3a7d
leaq 0x20(%rsp), %rdi
leaq 0x80(%rsp), %rsi
callq 0x4038
incq %r12
addq $0x4, %r13
cmpq $0x4, %r12
jne 0x398a
testq %rbp, %rbp
je 0x3aa0
movl $0x12, %esi
movq %rbp, %rdi
callq 0x2190
movq 0x30(%rsp), %rax
cmpq %rax, 0x50(%rsp)
jne 0x3932
leaq 0x20(%rsp), %rdi
callq 0x3e72
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x3ace
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x3e72
movq %rbx, %rdi
callq 0x22b0