// File: /workspace/github_cpp_makefile_star2_O1/jenniferdr[P]proyectoIAI/main.cc
// Function: main
int main(int argc, char *argv[]){

  if(argc!=5){
    std::cout << 
      "Error. Sintaxis: <algoritmo> <heuristica> <peso(W)> <archivo_iniciales>";
    std::cout << std::endl << "heuristica: manhattan, Mconflictos, static555 ";
    std::cout << std::endl << "algoritmo: a_estrella ida_estrella" << std::endl;
    return 1;
  }
  std::string algoritmo= std::string(argv[1]);
  if(algoritmo!= "a_estrella" && algoritmo!= "ida_estrella"){
    std::cout << "Error: algoritmo no valido";
    return 1;
  }
  std::string heuristica= std::string(argv[2]);
  if(heuristica!= "manhattan" && heuristica!= "Mconflictos"
     && heuristica!= "static555"){
    std::cout << "Error: heuristica no valida";
    return 1;
  }
  if(atoi(argv[3])<=0){
    std::cout << "Error: el peso debe ser mayor o igual a 1";
    return 1;
  }
  peso= atoi(argv[3]);
  
  std::ifstream archivo(argv[4]);
  
  if(!archivo){
    std::cout << "Ha fallado la lectura" << std::endl;
    return -1;
  }
  generarBD();
  generarTabla();
  char linea[40];

  while(archivo.getline(linea,40)){
    std::cout << linea << " : ";

    char estado[16];
    
    std::istringstream stream(linea,std::istringstream::in);
    for(int i=0; i<16;i++){
      char tile[3];
      stream >> tile;
      estado[i]= atoi(tile);
    }

    std::list<Nodo*> listaResuelto;
    Nodo *nodoResuelto;

    if(algoritmo=="a_estrella"){
      if(heuristica=="manhattan") nodoResuelto= a_manhattan(estado,peso);
      if(heuristica=="Mconflictos") nodoResuelto= a_conflictos(estado,peso);
      if(heuristica=="static555") nodoResuelto= a_static555(estado,peso);
    } 
    if(algoritmo=="ida_estrella"){
      if(heuristica=="manhattan") listaResuelto= ida_manhattan(estado);
      if(heuristica=="Mconflictos") listaResuelto= ida_conflictos(estado);
      if(heuristica=="static555") listaResuelto= ida_static555(estado);
      std::cout << " " << (int) listaResuelto.back()->distancia;
    }

    std::cout << "\n --- \n" << std::endl;
    /*    Nodo* res = a_static555(estado, 1);
	  extract_solution(res);*/
  }
 
  return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x448, %rsp            # imm = 0x448
cmpl $0x5, %edi
jne 0x4aa4
movq %rsi, %rbx
movq 0x8(%rsi), %rsi
leaq 0x70(%rsp), %r14
leaq 0x240(%rsp), %rdx
movq %r14, %rdi
callq 0x51ac
leaq 0x1786(%rip), %rsi      # 0x61df
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x4b69
leaq 0x176d(%rip), %rsi      # 0x61dd
leaq 0x70(%rsp), %rdi
callq 0x2090
testl %eax, %eax
je 0x4b69
movl $0x1, %ebx
movq 0x454a(%rip), %rdi      # 0x8fd8
leaq 0x1755(%rip), %rsi      # 0x61ea
movl $0x1a, %edx
callq 0x21a0
jmp 0x50a1
movq 0x452d(%rip), %rbx      # 0x8fd8
leaq 0x169e(%rip), %rsi      # 0x6150
movl $0x47, %edx
movq %rbx, %rdi
callq 0x21a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %esi
movq %rbx, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x2110
leaq 0x16ab(%rip), %rsi      # 0x6198
movl $0x2e, %edx
movq %rax, %rdi
callq 0x21a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %esi
movq %rbx, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x2110
movq %rax, %rbx
leaq 0x169c(%rip), %rsi      # 0x61c7
movl $0x22, %edx
movq %rax, %rdi
callq 0x21a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %esi
movq %rbx, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x2110
movl $0x1, %ebx
jmp 0x50c2
movq 0x10(%rbx), %rsi
leaq 0x38(%rsp), %rdi
leaq 0x240(%rsp), %rdx
callq 0x51ac
leaq 0x167f(%rip), %rsi      # 0x6205
leaq 0x38(%rsp), %rdi
callq 0x2090
testl %eax, %eax
je 0x4bcf
leaq 0x1674(%rip), %rsi      # 0x620f
leaq 0x38(%rsp), %rdi
callq 0x2090
testl %eax, %eax
je 0x4bcf
leaq 0x166b(%rip), %rsi      # 0x621b
leaq 0x38(%rsp), %rdi
callq 0x2090
testl %eax, %eax
je 0x4bcf
movl $0x1b, %edx
leaq 0x165b(%rip), %rsi      # 0x6225
jmp 0x4c74
movq 0x18(%rbx), %rdi
callq 0x2230
testl %eax, %eax
jle 0x4c68
leaq 0x304475d(%rip), %rcx   # 0x3049344
movl %eax, (%rcx)
movq 0x20(%rbx), %rsi
leaq 0x240(%rsp), %r12
movq %r12, %rdi
movl $0x8, %edx
callq 0x22d0
movq 0x240(%rsp), %rax
movq -0x18(%rax), %rax
testb $0x5, 0x260(%rsp,%rax)
je 0x4c8a
movq 0x43b9(%rip), %rbx      # 0x8fd8
leaq 0x1645(%rip), %rsi      # 0x626b
movl $0x15, %edx
movq %rbx, %rdi
callq 0x21a0
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %esi
movq 0x4387(%rip), %rdi      # 0x8fd8
callq 0x2030
movl $0xffffffff, %ebx       # imm = 0xFFFFFFFF
movq %rax, %rdi
callq 0x2110
jmp 0x5079
movl $0x29, %edx
leaq 0x15cd(%rip), %rsi      # 0x6241
movl $0x1, %ebx
movq 0x4358(%rip), %rdi      # 0x8fd8
callq 0x21a0
jmp 0x5086
callq 0x3ae3
callq 0x424c
leaq 0x10(%rsp), %rbp
leaq 0x90(%rsp), %r13
movq 0x4330(%rip), %r14      # 0x8fd8
movq %rsp, %rbx
leaq 0xc0(%rsp), %r15
movq 0x240(%rsp), %rax
movq -0x18(%rax), %rdi
addq %r12, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %ecx
movl $0x28, %edx
movq %r12, %rdi
movq %r13, %rsi
callq 0x22e0
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
testb $0x5, 0x20(%rax,%rcx)
jne 0x5077
movq %r13, %rdi
callq 0x20e0
movq %r14, %rdi
movq %r13, %rsi
movq %rax, %rdx
callq 0x21a0
movl $0x3, %edx
movq %r14, %rdi
leaq 0x156b(%rip), %rsi      # 0x6281
callq 0x21a0
movq %rbp, (%rsp)
movq %r13, %rdi
callq 0x20e0
leaq (%rsp,%rax), %rdx
addq $0x90, %rdx
movq %rbx, %rdi
movq %r13, %rsi
callq 0x51ea
movq %r15, %rdi
movq %rbx, %rsi
movl $0x8, %edx
callq 0x2260
movq (%rsp), %rdi
cmpq %rbp, %rdi
je 0x4d63
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x2190
xorl %ebp, %ebp
movq 0xc0(%rsp), %rax
movq -0x18(%rax), %rax
movq 0xd0(%rsp,%rax), %r12
movl $0x3, %edx
movq %r15, %rdi
movq %rbx, %rsi
callq 0x2290
movq 0xc0(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0xe0(%rsp,%rax)
jne 0x4dbb
addq $-0x4, %r12
cmpq $-0x4, %r12
ja 0x4dbb
movq 0x1a8(%rsp,%rax), %rdi
movq 0x10(%rdi), %rax
cmpq 0x18(%rdi), %rax
jae 0x4dd2
movq %rbx, %rdi
callq 0x2230
movb %al, 0x20(%rsp,%rbp)
incq %rbp
cmpq $0x10, %rbp
jne 0x4d65
jmp 0x4e01
movq (%rdi), %rax
callq *0x48(%rax)
cmpl $-0x1, %eax
jne 0x4dbb
movq 0xc0(%rsp), %rax
movq -0x18(%rax), %rax
leaq (%rsp,%rax), %rdi
addq $0xc0, %rdi
movl 0x20(%rdi), %esi
orl $0x2, %esi
callq 0x2270
jmp 0x4dbb
movq %rbx, 0x8(%rsp)
movq %rbx, (%rsp)
movq $0x0, 0x10(%rsp)
leaq 0x70(%rsp), %rdi
leaq 0x13c0(%rip), %rsi      # 0x61df
callq 0x2090
testl %eax, %eax
leaq 0x10(%rsp), %rbp
leaq 0x38(%rsp), %r12
jne 0x4ea4
movq %r12, %rdi
leaq 0x13c9(%rip), %rsi      # 0x6205
callq 0x2090
testl %eax, %eax
jne 0x4e58
leaq 0x30444f8(%rip), %rax   # 0x3049344
movl (%rax), %esi
leaq 0x20(%rsp), %rdi
callq 0x2a47
movq %r12, %rdi
leaq 0x13ad(%rip), %rsi      # 0x620f
callq 0x2090
testl %eax, %eax
jne 0x4e7e
leaq 0x30444d2(%rip), %rax   # 0x3049344
movl (%rax), %esi
leaq 0x20(%rsp), %rdi
callq 0x2a6b
movq %r12, %rdi
leaq 0x1393(%rip), %rsi      # 0x621b
callq 0x2090
testl %eax, %eax
jne 0x4ea4
leaq 0x30444ac(%rip), %rax   # 0x3049344
movl (%rax), %esi
leaq 0x20(%rsp), %rdi
callq 0x2a3b
leaq 0x70(%rsp), %rdi
leaq 0x132d(%rip), %rsi      # 0x61dd
callq 0x2090
testl %eax, %eax
jne 0x4ff5
movq %r12, %rdi
leaq 0x133e(%rip), %rsi      # 0x6205
callq 0x2090
testl %eax, %eax
jne 0x4f19
leaq 0x58(%rsp), %r12
movq %r12, %rdi
leaq 0x20(%rsp), %rsi
callq 0x4837
movq %rbx, %rdi
movq %r12, %rsi
callq 0x527a
movq 0x58(%rsp), %rdi
cmpq %r12, %rdi
je 0x4f0f
movq %r12, %rbp
movq (%rdi), %r12
movl $0x18, %esi
callq 0x2190
movq %r12, %rdi
cmpq %rbp, %r12
jne 0x4efa
leaq 0x38(%rsp), %r12
leaq 0x10(%rsp), %rbp
movq %r12, %rdi
leaq 0x12ec(%rip), %rsi      # 0x620f
callq 0x2090
testl %eax, %eax
jne 0x4f75
leaq 0x58(%rsp), %r12
movq %r12, %rdi
leaq 0x20(%rsp), %rsi
callq 0x49a5
movq %rbx, %rdi
movq %r12, %rsi
callq 0x527a
movq 0x58(%rsp), %rdi
cmpq %r12, %rdi
je 0x4f6b
movq %r12, %rbp
movq (%rdi), %r12
movl $0x18, %esi
callq 0x2190
movq %r12, %rdi
cmpq %rbp, %r12
jne 0x4f56
leaq 0x38(%rsp), %r12
leaq 0x10(%rsp), %rbp
movq %r12, %rdi
leaq 0x129c(%rip), %rsi      # 0x621b
callq 0x2090
testl %eax, %eax
jne 0x4fcc
leaq 0x58(%rsp), %r12
movq %r12, %rdi
leaq 0x20(%rsp), %rsi
callq 0x47bd
movq %rbx, %rdi
movq %r12, %rsi
callq 0x527a
movq 0x58(%rsp), %rdi
cmpq %r12, %rdi
je 0x4fc7
movq %r12, %rbp
movq (%rdi), %r12
movl $0x18, %esi
callq 0x2190
movq %r12, %rdi
cmpq %rbp, %r12
jne 0x4fb2
leaq 0x10(%rsp), %rbp
movl $0x1, %edx
movq %r14, %rdi
leaq 0x11ea(%rip), %rsi      # 0x61c5
callq 0x21a0
movq 0x8(%rsp), %rax
movq 0x10(%rax), %rax
movsbl 0x10(%rax), %esi
movq %r14, %rdi
callq 0x22a0
movl $0x7, %edx
movq %r14, %rdi
leaq 0x1281(%rip), %rsi      # 0x6285
callq 0x21a0
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x2170
movsbl %al, %esi
movq %r14, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x2110
movq (%rsp), %rdi
cmpq %rbx, %rdi
je 0x504e
movq (%rdi), %r12
movl $0x18, %esi
callq 0x2190
movq %r12, %rdi
cmpq %rbx, %r12
jne 0x5039
movq %r15, %rdi
movq 0x3f78(%rip), %rsi      # 0x8fd0
callq 0x21f0
leaq 0x138(%rsp), %rdi
callq 0x20a0
leaq 0x240(%rsp), %r12
jmp 0x4cb3
xorl %ebx, %ebx
leaq 0x240(%rsp), %rdi
callq 0x2070
leaq 0x48(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x50a1
movq 0x48(%rsp), %rsi
incq %rsi
callq 0x2190
leaq 0x80(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x50c2
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x2190
movl %ebx, %eax
addq $0x448, %rsp            # imm = 0x448
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x50d8
movq %rax, %r14
jmp 0x5168
jmp 0x50e8
jmp 0x5114
jmp 0x5114
jmp 0x5114
movq %rax, %r14
jmp 0x5183
jmp 0x510f
movq %rax, %r14
movq (%rsp), %rdi
cmpq %rbp, %rdi
je 0x515b
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x2190
jmp 0x515b
jmp 0x510f
movq %rax, %r14
jmp 0x515b
movq %rax, %r14
movq (%rsp), %rdi
cmpq %rbx, %rdi
je 0x513a
movq (%rdi), %r15
movl $0x18, %esi
callq 0x2190
movq %r15, %rdi
cmpq %rbx, %r15
jne 0x5120
jmp 0x513a
movq %rax, %r14
movq 0x3e8f(%rip), %rsi      # 0x8fd0
leaq 0xc0(%rsp), %rdi
callq 0x21f0
leaq 0x138(%rsp), %rdi
callq 0x20a0
leaq 0x240(%rsp), %rdi
callq 0x2070
leaq 0x48(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x5183
movq 0x48(%rsp), %rsi
incq %rsi
callq 0x2190
leaq 0x80(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x51a4
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x2190
movq %r14, %rdi
callq 0x22b0