// File: /workspace/github_cpp_makefile_star2_O2/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 0x4a71
movq %rsi, %rbx
movq 0x8(%rsi), %rsi
leaq 0x58(%rsp), %r14
leaq 0xc0(%rsp), %rdx
movq %r14, %rdi
callq 0x4e96
leaq 0x175e(%rip), %rsi      # 0x618f
movq %r14, %rdi
callq 0x4ed1
testb %al, %al
je 0x4ac5
leaq 0x1745(%rip), %rsi      # 0x618d
leaq 0x58(%rsp), %rdi
callq 0x4ed1
testb %al, %al
je 0x4ac5
movq 0x457b(%rip), %rdi      # 0x8fd8
leaq 0x1736(%rip), %rsi      # 0x619a
callq 0x2170
pushq $0x1
popq %rbx
jmp 0x4e04
movq 0x4560(%rip), %rbx      # 0x8fd8
leaq 0x1681(%rip), %rsi      # 0x6100
movq %rbx, %rdi
callq 0x2170
movq %rbx, %rdi
callq 0x2100
leaq 0x16b2(%rip), %rsi      # 0x6148
movq %rax, %rdi
callq 0x2170
movq %rbx, %rdi
callq 0x2100
leaq 0x16ca(%rip), %rsi      # 0x6177
movq %rax, %rdi
callq 0x2170
movq %rax, %rdi
callq 0x2100
pushq $0x1
popq %rbx
jmp 0x4e0e
movq 0x10(%rbx), %rsi
leaq 0x38(%rsp), %rdi
leaq 0xc0(%rsp), %rdx
callq 0x4e96
leaq 0x16d3(%rip), %rsi      # 0x61b5
leaq 0x38(%rsp), %rdi
callq 0x4ed1
testb %al, %al
je 0x4b23
leaq 0x16c8(%rip), %rsi      # 0x61bf
leaq 0x38(%rsp), %rdi
callq 0x4ed1
testb %al, %al
je 0x4b23
leaq 0x16bf(%rip), %rsi      # 0x61cb
leaq 0x38(%rsp), %rdi
callq 0x4ed1
testb %al, %al
je 0x4b23
leaq 0x16b4(%rip), %rsi      # 0x61d5
jmp 0x4b8d
movq 0x18(%rbx), %rdi
callq 0x2210
testl %eax, %eax
jle 0x4b86
leaq 0x30447ed(%rip), %rcx   # 0x3049324
movl %eax, (%rcx)
movq 0x20(%rbx), %rsi
leaq 0xc0(%rsp), %rdi
pushq $0x8
popq %rdx
callq 0x22a0
movq 0xc0(%rsp), %rax
movq -0x18(%rax), %rax
testb $0x5, 0xe0(%rsp,%rax)
je 0x4ba1
movq 0x446e(%rip), %rdi      # 0x8fd8
leaq 0x16aa(%rip), %rsi      # 0x621b
callq 0x2170
movq %rax, %rdi
callq 0x2100
pushq $-0x1
popq %rbx
jmp 0x4ded
leaq 0x1664(%rip), %rsi      # 0x61f1
movq 0x4444(%rip), %rdi      # 0x8fd8
callq 0x2170
pushq $0x1
popq %rbx
jmp 0x4dfa
callq 0x3bc7
callq 0x43d0
leaq 0x90(%rsp), %r14
leaq 0x18(%rsp), %rbp
leaq 0x78(%rsp), %r13
leaq 0x2c8(%rsp), %rbx
leaq 0x38(%rsp), %r15
leaq 0xc0(%rsp), %rdi
movq %r14, %rsi
pushq $0x28
popq %rdx
callq 0x2090
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
testb $0x5, 0x20(%rax,%rcx)
jne 0x4deb
movq 0x43e2(%rip), %rdi      # 0x8fd8
movq %r14, %rsi
callq 0x2170
movq %rax, %rdi
leaq 0x1629(%rip), %rsi      # 0x6231
callq 0x2170
movq %rbp, %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x4e96
movq %rbx, %rdi
movq %rbp, %rsi
pushq $0x8
popq %rdx
callq 0x2240
movq %rbp, %rdi
callq 0x20e0
xorl %r12d, %r12d
cmpq $0x10, %r12
je 0x4c56
movq %rbx, %rdi
movq %rbp, %rsi
callq 0x4edb
movq %rbp, %rdi
callq 0x2210
movb %al, (%rsp,%r12)
incq %r12
jmp 0x4c34
movq %rbp, 0x20(%rsp)
movq %rbp, 0x18(%rsp)
andq $0x0, 0x28(%rsp)
leaq 0x58(%rsp), %rdi
leaq 0x151d(%rip), %rsi      # 0x618f
callq 0x4ef3
testb %al, %al
je 0x4ce7
movq %r15, %rdi
leaq 0x1530(%rip), %rsi      # 0x61b5
callq 0x4ef3
testb %al, %al
je 0x4c9f
leaq 0x304468f(%rip), %rax   # 0x3049324
movl (%rax), %esi
movq %rsp, %rdi
callq 0x28c3
movq %r15, %rdi
leaq 0x1516(%rip), %rsi      # 0x61bf
callq 0x4ef3
testb %al, %al
je 0x4cc3
leaq 0x304466b(%rip), %rax   # 0x3049324
movl (%rax), %esi
movq %rsp, %rdi
callq 0x28e7
movq %r15, %rdi
leaq 0x14fe(%rip), %rsi      # 0x61cb
callq 0x4ef3
testb %al, %al
je 0x4ce7
leaq 0x3044647(%rip), %rax   # 0x3049324
movl (%rax), %esi
movq %rsp, %rdi
callq 0x28b7
leaq 0x58(%rsp), %rdi
leaq 0x149a(%rip), %rsi      # 0x618d
callq 0x4ef3
testb %al, %al
je 0x4dbb
movq %r15, %rdi
leaq 0x14ab(%rip), %rsi      # 0x61b5
callq 0x4ef3
testb %al, %al
je 0x4d31
movq %r13, %rdi
movq %rsp, %rsi
callq 0x49a4
movq %rbp, %rdi
movq %r13, %rsi
callq 0x4f96
movq %r13, %rdi
callq 0x3896
movq %r15, %rdi
leaq 0x1484(%rip), %rsi      # 0x61bf
callq 0x4ef3
testb %al, %al
je 0x4d62
movq %r13, %rdi
movq %rsp, %rsi
callq 0x49e3
movq %rbp, %rdi
movq %r13, %rsi
callq 0x4f96
movq %r13, %rdi
callq 0x3896
movq %r15, %rdi
leaq 0x145f(%rip), %rsi      # 0x61cb
callq 0x4ef3
testb %al, %al
je 0x4d93
movq %r13, %rdi
movq %rsp, %rsi
callq 0x498f
movq %rbp, %rdi
movq %r13, %rsi
callq 0x4f96
movq %r13, %rdi
callq 0x3896
movq 0x423e(%rip), %rdi      # 0x8fd8
leaq 0x13d4(%rip), %rsi      # 0x6175
callq 0x2170
movq 0x20(%rsp), %rcx
movq 0x10(%rcx), %rcx
movsbl 0x10(%rcx), %esi
movq %rax, %rdi
callq 0x2270
movq 0x4216(%rip), %rdi      # 0x8fd8
leaq 0x146c(%rip), %rsi      # 0x6235
callq 0x2170
movq %rax, %rdi
callq 0x2100
movq %rbp, %rdi
callq 0x3896
movq %rbx, %rdi
callq 0x20f0
jmp 0x4bca
xorl %ebx, %ebx
leaq 0xc0(%rsp), %rdi
callq 0x2060
leaq 0x38(%rsp), %rdi
callq 0x20e0
leaq 0x58(%rsp), %rdi
callq 0x20e0
movl %ebx, %eax
addq $0x448, %rsp            # imm = 0x448
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x4e2e
jmp 0x4e33
jmp 0x4e49
jmp 0x4e4e
jmp 0x4e4e
jmp 0x4e4e
movq %rax, %rbx
jmp 0x4e7a
movq %rax, %rbx
jmp 0x4e84
jmp 0x4e49
movq %rax, %rbx
leaq 0x18(%rsp), %rdi
callq 0x20e0
jmp 0x4e6d
movq %rax, %rbx
jmp 0x4e6d
movq %rax, %rbx
leaq 0x18(%rsp), %rdi
callq 0x3896
jmp 0x4e60
movq %rax, %rbx
leaq 0x2c8(%rsp), %rdi
callq 0x20f0
leaq 0xc0(%rsp), %rdi
callq 0x2060
leaq 0x38(%rsp), %rdi
callq 0x20e0
leaq 0x58(%rsp), %rdi
callq 0x20e0
movq %rbx, %rdi
callq 0x2280