#include #include #include using namespace std; set> visited; //这里默认九宫格 void swapUp(vector& _v, int _i){ if(_i == 0 || _i == 1 || _i ==2 ) return; swap(_v[_i], _v[_i - 3]); } void swapDown(vector& _v, int _i){ if(_i == 6 || _i == 7 || _i ==8 ) return; swap(_v[_i], _v[_i + 3]); } void swapLeft(vector& _v, int _i){ if(_i == 0 || _i == 3 || _i ==6 ) return; swap(_v[_i], _v[_i - 1]); } void swapRight(vector& _v, int _i){ if(_i == 2 || _i == 5 || _i ==8 ) return; swap(_v[_i], _v[_i + 1]); } //x -> 白格位置 void dfs(vector _aim, vector _v, int step, int x){ if(visited.count(_v)) return; // 避免重复状态 visited.insert(_v); // 上 if(x >= 3){ vector tmp = _v; swapUp(tmp, x); dfs(_aim, tmp, step + 1, x - 3); } // 下 if(x <= 5){ vector tmp = _v; swapDown(tmp, x); dfs(_aim, tmp, step + 1, x + 3); } // 左 if(x % 3 != 0){ vector tmp = _v; swapLeft(tmp, x); dfs(_aim, tmp, step + 1, x - 1); } // 右 if(x % 3 != 2){ vector tmp = _v; swapRight(tmp, x); dfs(_aim, tmp, step + 1, x + 1); } //比较 if(_aim == _v){ cout << step << " "; return; } } int main(){ int n; cin >> n; vector arr(n, -1); vector aim(n, -1); int pos; for(int i = 0; i < n; i++){ cin >> arr[i]; if(arr[i] == 0) pos = i; } for(int i = 0; i < n; i++){ cin >> aim[i]; } dfs(aim, arr, 0, pos); return 0; } /* 9 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 */