#define _CRT_SECURE_NO_WARNINGS #define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING #include using namespace std; #define CRP(t, x) const t &x #define OPL(t, x) bool operator<(CRP(t, x)) const #define FIL(x, v) memset(x, v, sizeof(x)) #define CLR(x) FIL(x, 0) #define NE1(x) FIL(x, -1) #define INF(x) FIL(x, 0x3f) typedef long long ll, i64; #define is_right tmp.zeo % 4 == 0 #define is_up tmp.zeo >= 1 && tmp.zeo <= 4 #define is_down tmp.zeo >= 13 && tmp.zeo <= 16 #define is_left tmp.zeo % 4 == 1 using namespace std; struct lst { string s; int stp; int zeo; }; char cg[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; map mp; queue q; const int um = 15; int main() { lst be; be.s = "x123456789ABCDEF0"; be.stp = 0; be.zeo = 16; mp[be.s] = 0; int cnt = 0; q.push(be); while (!q.empty()) { cnt++; lst tmp = q.front(); q.pop(); if (tmp.stp > mp[tmp.s]) continue; bool goup = 1, godown = 1, goleft = 1, goright = 1; if (is_right) { goright = 0; } if (is_up) { goup = 0; } if (is_down) { godown = 0; } if (is_left) { goleft = 0; } if (goup) { lst qins = tmp; swap(qins.s[qins.zeo], qins.s[qins.zeo - 4]); qins.zeo -= 4; qins.stp++; if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp))) { q.push(qins); mp[qins.s] = qins.stp; } } if (godown) { lst qins = tmp; swap(qins.s[qins.zeo], qins.s[qins.zeo + 4]); qins.zeo += 4; qins.stp++; if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp))) { q.push(qins); mp[qins.s] = qins.stp; } } if (goleft) { lst qins = tmp; swap(qins.s[qins.zeo], qins.s[qins.zeo - 1]); qins.zeo -= 1; qins.stp++; if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp))) { q.push(qins); mp[qins.s] = qins.stp; } } if (goright) { lst qins = tmp; swap(qins.s[qins.zeo], qins.s[qins.zeo + 1]); qins.zeo += 1; qins.stp++; if (qins.stp <= um && ((!mp.count(qins.s) || mp[qins.s] > qins.stp))) { q.push(qins); mp[qins.s] = qins.stp; } } } // cout<