#include #include #include #include #include #include #include using namespace std; #define INF 10000000 #define mp make_pair typedef pair pii; //typedef vector vi; typedef string vi; vi final= "123456780"; //vetor final ... pii manh[20]; unordered_map visitado; int lim, plim; int h_man(string& s) { int ret = 0; for (int i = 0; i < (int)s.size(); i++) { if (s[i] != '0') ret += abs(manh[s[i]-'0'].first - i/3) + abs(manh[s[i]-'0'].second - i%3); } return ret; } int h(vi &puzzle) { int ans = 0; for (int i = 0; i < puzzle.size(); i++) { ans += final[i] != puzzle[i]; } return ans; } int find_pos(vi &puzzle, char vazio){ for (int i = 0; i < puzzle.size(); i++) if (puzzle[i] == vazio) return (i); return -1; } void next_states(vi &s, int &n, vi next[4], char *m){ int pos = find_pos(s, '0'); // encontra a posicao do zero... int lin = pos/3; int col = pos%3; next[0] = next[1] = next[2] = next[3] = s; //next[0].depth = next[1].depth = next[2].depth = next[3].depth = s.depth+1; if (lin == 0 && col == 0){ n = 2; swap(next[0][lin*3+col], next[0][lin*3+col+1]); m[0] = 'r'; // troca colunas swap(next[1][lin*3+col], next[1][(lin+1)*3+col]); m[1] = 'd'; // troca linhas } else if (lin == 0 && col == 2){ n = 2; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l'; // troca colunas swap(next[1][lin*3+col], next[1][(lin+1)*3+col]); m[1] = 'd'; // troca linhas } else if (lin == 2 && col == 0){ n = 2; swap(next[0][lin*3+col], next[0][lin*3+col+1]); m[0] = 'r';// troca colunas swap(next[1][lin*3+col], next[1][(lin-1)*3+col]); m[1] = 'u';// troca linhas } else if (lin == 2 && col == 2){ n = 2; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l';// troca colunas swap(next[1][lin*3+col], next[1][(lin-1)*3+col]); m[1] = 'u';// troca linhas } else if(lin == 0 && col == 1){ n = 3; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l';// troca colunas swap(next[1][lin*3+col], next[1][lin*3+col+1]); m[1] = 'r';// troca colunas swap(next[2][lin*3+col], next[2][(lin+1)*3+col]); m[2] = 'd';// troca linhas } else if(lin == 2 && col == 1){ n = 3; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l';// troca colunas swap(next[1][lin*3+col], next[1][lin*3+col+1]); m[1] = 'r';// troca colunas swap(next[2][lin*3+col], next[2][(lin-1)*3+col]); m[2] = 'u';// troca linhas } else if(lin == 1 && col == 0){ n = 3; swap(next[0][lin*3+col], next[0][lin*3+col+1]); m[0] = 'r';// troca coluna swap(next[1][lin*3+col], next[1][(lin-1)*3+col]); m[1] = 'u';// troca linha swap(next[2][lin*3+col], next[2][(lin+1)*3+col]); m[2] = 'd';// troca linha } else if(lin == 1 && col == 2){ n = 3; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l';// troca coluna swap(next[1][lin*3+col], next[1][(lin-1)*3+col]); m[1] = 'u';// troca linha swap(next[2][lin*3+col], next[2][(lin+1)*3+col]); m[2] = 'd';// troca linha } else { // 0 está no centro do tabuleiro.. troca os 4.... n = 4; swap(next[0][lin*3+col], next[0][lin*3+col-1]); m[0] = 'l';// troca coluna swap(next[1][lin*3+col], next[1][lin*3+col+1]); m[1] = 'r';// troca coluna swap(next[2][lin*3+col], next[2][(lin-1)*3+col]); m[2] = 'u';// troca linha swap(next[3][lin*3+col], next[3][(lin+1)*3+col]); m[3] = 'd';// troca linha } } bool DLS(int g, int h, string current, string &result){ int qtd; vi next[4]; char moves[4]; if (current==final) { result = visitado[current]; return true; } if (lim < g+h) { plim = min(plim, g+h); return false; } next_states(current, qtd, next, moves); for (int i=0; i s[j]; } return (inv%2 == 0) ? true : false; } int IDA(string inicio, string& result){ lim = 0 + h_man(inicio); while (true){ // veja se nao precisa resetar coisas visitado.clear(); plim = INF; visitado[inicio] = ""; if (DLS(0, h_man(inicio), inicio, result)) return lim; if (plim == INF) // nao achei nada; return -1; lim = plim; if (lim > 32) // é sabido que para o problema do puzzle, 32 é o limite maximo.. return -1; } } int main(int argc, char const *argv[]){ int t; string result; for (int i = 0; i < (int)final.size(); i++) manh[final[i]-'0'] = mp(i/3, i%3); cin >> t; while(t--) { //vi s = {2,8,3,1,6,4,7,0,5}; vi s; char k; for (int i = 0; i < 9; i++) { cin >> k; if (k == 'x') k = '0'; s += k; } //cout << s << endl; if (isSolvable(s)){ if (IDA(s, result) != -1) cout << result << endl; //else cout << "unsolvable" << endl; } else cout << "unsolvable" << endl; if (t > 0) cout << endl; } return 0; }