1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| #include <iostream> #include <vector> #include <queue> #include <climits> #include <algorithm> #define endl '\n' #define int long long #define x first #define y second #define umap unordered_map #define All(x) x.begin(),x.end() #pragma GCC optimize(3,"Ofast","inline") #define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0) using namespace std; const int N = 2e6 + 10; inline void solve();
signed main() {
IOS; int _t = 1; while (_t--) { solve(); } return 0; } using PII = pair<int,int>; int n,m; PII rem[256]; char g[110][110];
int dist[256][256];
int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0};
inline int Dist(char a,char b) { vector<vector<bool>>st(110,vector<bool>(110,false)); auto isRun = [&](int x,int y)->bool { return (x >= 0 and x < n and y >= 0 and y < m and !st[x][y] and g[x][y] != '#'); }; int step = 0; queue<PII>q; q.emplace(rem[a]); while(q.size()) { int sz = q.size(); while(sz--) { PII now = q.front(); q.pop(); if(g[now.x][now.y] == b) { rem[b] = now; return step; } st[now.x][now.y] = true; for(int i = 0;i < 4;++i) { int bx = now.x + dx[i]; int by = now.y + dy[i]; if(isRun(bx,by)) { st[bx][by] = true; q.emplace(PII(bx,by)); } } } ++step; } return INT_MAX; }
inline void solve() { vector<char>plan = {'J','O','K','E','R','j','o','k','e','r'};
cin >> n >> m; for(int i = 0;i < n;++i) { for(int j = 0;j < m;++j) { char c; cin >> c; g[i][j] = c; if(c == '(') rem[c] = PII(i,j); if(c == ')') rem[c] = PII(i,j); } } for(char &p:plan) dist['('][p] = Dist('(',p); for(char &p:plan) dist[p][')'] = Dist(')',p); for(char &st:plan) { for(char &ed:plan) { if(st == ed) continue; dist[st][ed] = Dist(st,ed); } } sort(All(plan)); int ans = INT_MAX; do { int res = 0; res += dist['('][*plan.begin()]; for(int i = 1;i < 10;++i) res += dist[plan[i - 1]][plan[i]]; res += dist[plan.back()][')']; ans = min(ans,res);
}while(next_permutation(All(plan)));
if(ans >= INT_MAX) cout << "-1" << endl; else cout << ans << endl; }
|