#include using namespace std; const int n = 20; const int q_siz = 20; const double keep_p = 0.97; mt19937 mt(114514); uniform_real_distribution<> d01(0, 1); struct Question { bitset<20> M[20]; int sx, sy, tx, ty, bx, by; }; Question start_question; namespace Solve { bitset<20> mp[20]; int dis[20][20][20][20]; queue> qu; inline int bfs(int px, int py, int bx, int by, int tx, int ty) { memset(dis, 127, sizeof(dis)); while (!qu.empty()) qu.pop(); auto expand = [&](int npx, int npy, int nbx, int nby, int d) { if (npx < 0 || npx >= n) return; if (npy < 0 || npy >= n) return; if (nbx < 0 || nbx >= n) return; if (nby < 0 || nby >= n) return; if (mp[npx][npy] == 0) return; if (mp[nbx][nby] == 0) return; if (npx == nbx && npy == nby) return; if (dis[npx][npy][nbx][nby] <= d) return; dis[npx][npy][nbx][nby] = d; qu.emplace(npx, npy, nbx, nby); }; expand(px, py, bx, by, 0); while (!qu.empty()) { auto [npx, npy, nbx, nby] = qu.front(); int d = dis[npx][npy][nbx][nby]; qu.pop(); // cout<<"Now player at ( "<> s; for (int j = 0; j < n; j++) { if (s[j] == '#') start_question.M[i][j] = 0; else start_question.M[i][j] = 1; if (s[j] == 'P') start_question.sx = i, start_question.sy = j; if (s[j] == '*') start_question.bx = i, start_question.by = j; if (s[j] == 'O') start_question.tx = i, start_question.ty = j; } } // cout<<"Start question : *********************"<