Language: C++

#include <iostream>
#include <unorderd_set>
#include <string>
#include <vector>
using namespace std;

#define N 4

string goal("bcdefghijklmnopa");

int calc_heuristic(string state){
	int count = 0;
	for(int i=0 ; i < 15 ; i++ ) if(state[i] != goal[i]) count++;
	return count;
}

int main(void){

	vector<string> st_stk;
	vector<int> pos_stk;
	vector< unorderd_set<string> > hash_stk;
	vector<int> step_stk;

	string state;
	int position;
	unorderd_set<string> hash;
	int step;

	int in_raw[4];
	for(int i=0 ; i < N ; i++){
		cin >> in_raw[0] >> in_raw[1] >> in_raw[2] >> in_raw[3];

		for(int j=0 ; j < N ; j++){ 
			state += ('a' + in_raw[j]);
			if(in_raw[j] == 0) position = i*N + j;
		}

	}
	hash.insert(state);

	st_stk.push_back(state);
	pos_stk.push_back(position);
	hash_stk.push_back(hash);
	step_stk.push_back(0);

	int h;
	int limit = 45;

	while( pos_stk.size() != 0 ){

		state = st_stk.back();
		position = pos_stk.back();
		hash = hash_stk.back();
		step = step_stk.back();

		st_stk.pop_back();
		pos_stk.pop_back();
		hash_stk.pop_back();
		step_stk.pop_back();

		step++;

		if(position + N < 16){
			string child(state);
			child[position]=child[position+N];
			child[position+N] = 'a';
			h = calc_heuristic(child);
			if(h == 0){
				limit = step;
				continue;
			}
			else if(h + step < limit && hash.find(child) == hash.end()){
				st_stk.push_back(child);
				pos_stk.push_back(position+N);

				unorderd_set<string> hash_tmp(hash);
				hash_tmp.insert(child);
				hash_stk.push_back(hash_tmp);

				step_stk.push_back(step);
			}
		}

		if(position - N >= 0){
			string child(state);
			child[position]=child[position-N];
			child[position-N] = 'a';
			h = calc_heuristic(child);
			if(h == 0){
				limit = step;
				continue;
			}
			else if(h + step < limit && hash.find(child) == hash.end()){
				st_stk.push_back(child);
				pos_stk.push_back(position-N);

				unorderd_set<string> hash_tmp(hash);
				hash_tmp.insert(child);
				hash_stk.push_back(hash_tmp);

				step_stk.push_back(step);
			}
		}

		if(position % N != N-1){
			string child(state);
			child[position]=child[position+1];
			child[position+1] = 'a';
			h = calc_heuristic(child);
			if(h == 0){
				limit = step;
				continue;
			}
			else if(h + step < limit && hash.find(child) == hash.end()){
				st_stk.push_back(child);
				pos_stk.push_back(position+1);

				unorderd_set<string> hash_tmp(hash);
				hash_tmp.insert(child);
				hash_stk.push_back(hash_tmp);

				step_stk.push_back(step);
			}
		}

		if(position % N != 0){
			string child(state);
			child[position]=child[position-1];
			child[position-1] = 'a';
			h = calc_heuristic(child);
			if(h == 0){
				limit = step;
				continue;
			}
			else if(h + step < limit && hash.find(child) == hash.end()){
				st_stk.push_back(child);
				pos_stk.push_back(position-1);

				unorderd_set<string> hash_tmp(hash);
				hash_tmp.insert(child);
				hash_stk.push_back(hash_tmp);

				step_stk.push_back(step);
			}
		}


	}


    cout << limit << endl;
    return 0;
}


Compiler output:
a.cc:2:10: fatal error: unorderd_set: No such file or directory
    2 | #include <unorderd_set>
      |          ^~~~~~~~~~~~~~
compilation terminated.