// File: 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
movq %rsp, %rbp
subq $0x570, %rsp            # imm = 0x570
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpl $0x5, -0x8(%rbp)
je 0xb121
movq 0x7f22(%rip), %rdi      # 0x12fd8
leaq 0x1033(%rip), %rsi      # 0xc0f0
callq 0x21a0
movq 0x7f0f(%rip), %rdi      # 0x12fd8
movq 0x7ef8(%rip), %rsi      # 0x12fc8
callq 0x21d0
movq %rax, %rdi
leaq 0x1059(%rip), %rsi      # 0xc138
callq 0x21a0
movq 0x7eed(%rip), %rdi      # 0x12fd8
movq 0x7ed6(%rip), %rsi      # 0x12fc8
callq 0x21d0
movq %rax, %rdi
leaq 0x1066(%rip), %rsi      # 0xc167
callq 0x21a0
movq %rax, %rdi
movq 0x7eb8(%rip), %rsi      # 0x12fc8
callq 0x21d0
movl $0x1, -0x4(%rbp)
jmp 0xb8e3
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x4d8(%rbp)
leaq -0x31(%rbp), %rdi
movq %rdi, -0x4d0(%rbp)
callq 0x2330
movq -0x4d8(%rbp), %rsi
movq -0x4d0(%rbp), %rdx
leaq -0x30(%rbp), %rdi
callq 0xb900
jmp 0xb159
leaq -0x31(%rbp), %rdi
callq 0x21f0
leaq 0x1016(%rip), %rsi      # 0xc17f
leaq -0x30(%rbp), %rdi
callq 0xb9b0
movb %al, -0x4d9(%rbp)
jmp 0xb17a
movb -0x4d9(%rbp), %al
testb $0x1, %al
jne 0xb186
jmp 0xb1fd
leaq 0xff0(%rip), %rsi       # 0xc17d
leaq -0x30(%rbp), %rdi
callq 0xb9b0
movb %al, -0x4da(%rbp)
jmp 0xb19e
movb -0x4da(%rbp), %al
testb $0x1, %al
jne 0xb1aa
jmp 0xb1fd
movq 0x7e27(%rip), %rdi      # 0x12fd8
leaq 0xfd2(%rip), %rsi       # 0xc18a
callq 0x21a0
jmp 0xb1bf
movl $0x1, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0xb8cd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x31(%rbp), %rdi
callq 0x21f0
jmp 0xb8ef
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0xb8d8
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x4f0(%rbp)
leaq -0x69(%rbp), %rdi
movq %rdi, -0x4e8(%rbp)
callq 0x2330
movq -0x4f0(%rbp), %rsi
movq -0x4e8(%rbp), %rdx
leaq -0x68(%rbp), %rdi
callq 0xb900
jmp 0xb235
leaq -0x69(%rbp), %rdi
callq 0x21f0
leaq 0xf60(%rip), %rsi       # 0xc1a5
leaq -0x68(%rbp), %rdi
callq 0xb9b0
movb %al, -0x4f1(%rbp)
jmp 0xb256
movb -0x4f1(%rbp), %al
testb $0x1, %al
jne 0xb265
jmp 0xb300
leaq 0xf43(%rip), %rsi       # 0xc1af
leaq -0x68(%rbp), %rdi
callq 0xb9b0
movb %al, -0x4f2(%rbp)
jmp 0xb27d
movb -0x4f2(%rbp), %al
testb $0x1, %al
jne 0xb289
jmp 0xb300
leaq 0xf2b(%rip), %rsi       # 0xc1bb
leaq -0x68(%rbp), %rdi
callq 0xb9b0
movb %al, -0x4f3(%rbp)
jmp 0xb2a1
movb -0x4f3(%rbp), %al
testb $0x1, %al
jne 0xb2ad
jmp 0xb300
movq 0x7d24(%rip), %rdi      # 0x12fd8
leaq 0xf0a(%rip), %rsi       # 0xc1c5
callq 0x21a0
jmp 0xb2c2
movl $0x1, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0xb8b7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x69(%rbp), %rdi
callq 0x21f0
jmp 0xb8d8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0xb8c2
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x22b0
cmpl $0x0, %eax
jg 0xb33a
movq 0x7cbf(%rip), %rdi      # 0x12fd8
leaq 0xec1(%rip), %rsi       # 0xc1e1
callq 0x21a0
jmp 0xb327
movl $0x1, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0xb8b7
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x22b0
movl %eax, %ecx
leaq 0x3048034(%rip), %rax   # 0x3053384
movl %ecx, (%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
leaq -0x278(%rbp), %rdi
movl $0x8, %edx
callq 0x2350
jmp 0xb36d
movq -0x278(%rbp), %rax
movq -0x18(%rax), %rax
leaq -0x278(%rbp,%rax), %rdi
callq 0x20e0
movb %al, -0x4f4(%rbp)
jmp 0xb38d
movb -0x4f4(%rbp), %al
testb $0x1, %al
jne 0xb399
jmp 0xb3ee
movq 0x7c38(%rip), %rdi      # 0x12fd8
leaq 0xe64(%rip), %rsi       # 0xc20b
callq 0x21a0
movq %rax, -0x500(%rbp)
jmp 0xb3b5
movq -0x500(%rbp), %rdi
movq 0x7c05(%rip), %rsi      # 0x12fc8
callq 0x21d0
jmp 0xb3ca
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x48(%rbp)
jmp 0xb89b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0xb8a9
callq 0x8a80
jmp 0xb3f5
callq 0xa4a0
jmp 0xb3fc
jmp 0xb3fe
leaq -0x278(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
movl $0x28, %edx
callq 0x20a0
movq %rax, -0x508(%rbp)
jmp 0xb41f
movq -0x508(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x2230
movb %al, -0x509(%rbp)
jmp 0xb43d
movb -0x509(%rbp), %al
testb $0x1, %al
jne 0xb44c
jmp 0xb88d
movq 0x7b85(%rip), %rdi      # 0x12fd8
leaq -0x2a0(%rbp), %rsi
callq 0x21a0
movq %rax, -0x518(%rbp)
jmp 0xb468
movq -0x518(%rbp), %rdi
leaq 0xdab(%rip), %rsi       # 0xc221
callq 0x21a0
jmp 0xb47d
leaq -0x451(%rbp), %rdi
movq %rdi, -0x520(%rbp)
callq 0x2330
movq -0x520(%rbp), %rdx
leaq -0x450(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
callq 0xb900
jmp 0xb4ac
leaq -0x430(%rbp), %rdi
leaq -0x450(%rbp), %rsi
movl $0x8, %edx
callq 0x22e0
jmp 0xb4c6
leaq -0x450(%rbp), %rdi
callq 0x2130
leaq -0x451(%rbp), %rdi
callq 0x21f0
movl $0x0, -0x458(%rbp)
cmpl $0x10, -0x458(%rbp)
jge 0xb57f
leaq -0x430(%rbp), %rdi
leaq -0x45b(%rbp), %rsi
callq 0xb9e0
jmp 0xb50a
leaq -0x45b(%rbp), %rdi
callq 0x22b0
movb %al, %cl
movslq -0x458(%rbp), %rax
movb %cl, -0x2b0(%rbp,%rax)
movl -0x458(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x458(%rbp)
jmp 0xb4e8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0xb55d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x450(%rbp), %rdi
callq 0x2130
leaq -0x451(%rbp), %rdi
callq 0x21f0
jmp 0xb8a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0xb87f
leaq -0x478(%rbp), %rdi
callq 0x7e60
leaq 0xbed(%rip), %rsi       # 0xc17f
leaq -0x30(%rbp), %rdi
callq 0xba30
movb %al, -0x521(%rbp)
jmp 0xb5a3
movb -0x521(%rbp), %al
testb $0x1, %al
jne 0xb5b2
jmp 0xb6c3
leaq 0xbec(%rip), %rsi       # 0xc1a5
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x522(%rbp)
jmp 0xb5ca
movb -0x522(%rbp), %al
testb $0x1, %al
jne 0xb5d6
jmp 0xb621
leaq 0x3047da7(%rip), %rax   # 0x3053384
movl (%rax), %esi
leaq -0x2b0(%rbp), %rdi
callq 0x2e90
movq %rax, -0x530(%rbp)
jmp 0xb5f4
movq -0x530(%rbp), %rax
movq %rax, -0x480(%rbp)
jmp 0xb621
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x478(%rbp), %rdi
callq 0x7ec0
jmp 0xb87f
leaq 0xb87(%rip), %rsi       # 0xc1af
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x531(%rbp)
jmp 0xb639
movb -0x531(%rbp), %al
testb $0x1, %al
jne 0xb645
jmp 0xb671
leaq 0x3047d38(%rip), %rax   # 0x3053384
movl (%rax), %esi
leaq -0x2b0(%rbp), %rdi
callq 0x2f20
movq %rax, -0x540(%rbp)
jmp 0xb663
movq -0x540(%rbp), %rax
movq %rax, -0x480(%rbp)
leaq 0xb43(%rip), %rsi       # 0xc1bb
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x541(%rbp)
jmp 0xb689
movb -0x541(%rbp), %al
testb $0x1, %al
jne 0xb695
jmp 0xb6c1
leaq 0x3047ce8(%rip), %rax   # 0x3053384
movl (%rax), %esi
leaq -0x2b0(%rbp), %rdi
callq 0x2e60
movq %rax, -0x550(%rbp)
jmp 0xb6b3
movq -0x550(%rbp), %rax
movq %rax, -0x480(%rbp)
jmp 0xb6c3
leaq 0xab3(%rip), %rsi       # 0xc17d
leaq -0x30(%rbp), %rdi
callq 0xba30
movb %al, -0x551(%rbp)
jmp 0xb6db
movb -0x551(%rbp), %al
testb $0x1, %al
jne 0xb6ea
jmp 0xb831
leaq 0xab4(%rip), %rsi       # 0xc1a5
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x552(%rbp)
jmp 0xb702
movb -0x552(%rbp), %al
testb $0x1, %al
jne 0xb70e
jmp 0xb742
leaq -0x498(%rbp), %rdi
leaq -0x2b0(%rbp), %rsi
callq 0xaea0
jmp 0xb723
leaq -0x478(%rbp), %rdi
leaq -0x498(%rbp), %rsi
callq 0xba60
leaq -0x498(%rbp), %rdi
callq 0x7ec0
leaq 0xa66(%rip), %rsi       # 0xc1af
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x553(%rbp)
jmp 0xb75a
movb -0x553(%rbp), %al
testb $0x1, %al
jne 0xb766
jmp 0xb79a
leaq -0x4b0(%rbp), %rdi
leaq -0x2b0(%rbp), %rsi
callq 0xaf60
jmp 0xb77b
leaq -0x478(%rbp), %rdi
leaq -0x4b0(%rbp), %rsi
callq 0xba60
leaq -0x4b0(%rbp), %rdi
callq 0x7ec0
leaq 0xa1a(%rip), %rsi       # 0xc1bb
leaq -0x68(%rbp), %rdi
callq 0xba30
movb %al, -0x554(%rbp)
jmp 0xb7b2
movb -0x554(%rbp), %al
testb $0x1, %al
jne 0xb7be
jmp 0xb7f2
leaq -0x4c8(%rbp), %rdi
leaq -0x2b0(%rbp), %rsi
callq 0xae60
jmp 0xb7d3
leaq -0x478(%rbp), %rdi
leaq -0x4c8(%rbp), %rsi
callq 0xba60
leaq -0x4c8(%rbp), %rdi
callq 0x7ec0
movq 0x77df(%rip), %rdi      # 0x12fd8
leaq 0x965(%rip), %rsi       # 0xc165
callq 0x21a0
movq %rax, -0x560(%rbp)
jmp 0xb80e
leaq -0x478(%rbp), %rdi
callq 0xba90
movq -0x560(%rbp), %rdi
movq (%rax), %rax
movsbl 0x10(%rax), %esi
callq 0x2310
jmp 0xb82f
jmp 0xb831
movq 0x77a0(%rip), %rdi      # 0x12fd8
leaq 0x9e6(%rip), %rsi       # 0xc225
callq 0x21a0
movq %rax, -0x568(%rbp)
jmp 0xb84d
movq -0x568(%rbp), %rdi
movq 0x776d(%rip), %rsi      # 0x12fc8
callq 0x21d0
jmp 0xb862
leaq -0x478(%rbp), %rdi
callq 0x7ec0
leaq -0x430(%rbp), %rdi
callq 0x20f0
jmp 0xb3fe
leaq -0x430(%rbp), %rdi
callq 0x20f0
jmp 0xb8a9
movl $0x0, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
leaq -0x278(%rbp), %rdi
callq 0x2070
jmp 0xb8b7
leaq -0x278(%rbp), %rdi
callq 0x2070
jmp 0xb8c2
leaq -0x68(%rbp), %rdi
callq 0x2130
jmp 0xb8cd
leaq -0x68(%rbp), %rdi
callq 0x2130
jmp 0xb8d8
leaq -0x30(%rbp), %rdi
callq 0x2130
jmp 0xb8e3
leaq -0x30(%rbp), %rdi
callq 0x2130
jmp 0xb8ef
movl -0x4(%rbp), %eax
addq $0x570, %rsp            # imm = 0x570
popq %rbp
retq
movq -0x40(%rbp), %rdi
callq 0x2320
nopl (%rax,%rax)