15 puzzle solver: Difference between revisions

Line 20:
// Solve Random 15 Puzzles : Nigel Galloway - October 11th., 2017
const int Nr[]{3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3}, Nc[]{3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2};
using N = std::tuple<int,int,unsigned long,std::string,bool,int>;
void fN(const N,const int);
const N fI(const N n){
Line 26:
unsigned long a = std::get<2>(n)&((unsigned long)15<<g);
bool l = Nr[a>>g]<=std::get<0>(n);
return N (std::get<0>(n)+1,std::get<1>(n),std::get<2>(n)-a+(a<<16),std::get<3>(n)+"d",l,l?std::get<54>(n):std::get<54>(n)+1);
}
const N fG(const N n){
Line 32:
unsigned long a = std::get<2>(n)&((unsigned long)15<<g);
bool l = Nr[a>>g]>=std::get<0>(n);
return N (std::get<0>(n)-1,std::get<1>(n),std::get<2>(n)-a+(a>>16),std::get<3>(n)+"u",l,l?std::get<54>(n):std::get<54>(n)+1);
}
const N fE(const N n){
Line 38:
unsigned long a = std::get<2>(n)&((unsigned long)15<<g);
bool l = Nc[a>>g]<=std::get<1>(n);
return N (std::get<0>(n),std::get<1>(n)+1,std::get<2>(n)-a+(a<<4),std::get<3>(n)+"r",l,l?std::get<54>(n):std::get<54>(n)+1);
}
const N fL(const N n){
Line 44:
unsigned long a = std::get<2>(n)&((unsigned long)15<<g);
bool l = Nc[a>>g]>=std::get<1>(n);
return N (std::get<0>(n),std::get<1>(n)-1,std::get<2>(n)-a+(a>>4),std::get<3>(n)+"l",l,l?std::get<54>(n):std::get<54>(n)+1);
}
void fZ(const N n, const int g){
Line 50:
int g{};for (char a: std::get<3>(n)) ++g;
std::cout<<"Solution found with "<<g<<" moves: "<<std::get<3>(n)<<std::endl; exit(0);}
if (std::get<4>(n) | std::get<5>(n) <= g) fN(n,g);
}
void fN(const N n, const int g){
2,172

edits