Submission #1276848

#TimeUsernameProblemLanguageResultExecution timeMemory
1276848g4yuhgRobots (APIO13_robots)C++20
10 / 100
1 ms580 KiB
//Huyduocdithitp #include<bits/stdc++.h> typedef int ll; #define endl '\n' #define fi first #define se second #define pii pair<ll, ll> #define N 505 using namespace std; ll getbit(ll mask, ll i) { return (mask >> i) & 1; } ll onbit(ll mask, ll i){ return mask | (1 << i); } const ll inf = 1e9; const ll hx[] = {-1, 0, 1, 0}; // len phai xuong trai const ll hy[] = {0, 1, 0, -1}; bool ghuy4g; ll n, w, h, ans = inf; char a[N][N]; bool is[N][N][4]; ll vst[N][N][4]; pii nxt[N][N][4]; vector<ll> adj[N]; ll luot = 0; bool isthem[N][N]; queue<pii> q; pii dfs(ll i, ll j, ll t) { ////cout << i << " " << j << " " << t << endl; vst[i][j][t] = luot; ll ii, jj, tt; if (a[i][j] == 'A') { tt = t - 1; if (tt < 0) tt = 3; ii = i + hx[tt]; jj = j + hy[tt]; } else if (a[i][j] == 'C') { tt = t + 1; if (tt == 4) tt = 0; ii = i + hx[tt]; jj = j + hy[tt]; } else { ii = i + hx[t]; jj = j + hy[t]; tt = t; } if (ii < 1 || ii > h || jj < 1 || jj > w || a[ii][jj] == 'x') { ////cout << "chan roi " << endl; if (isthem[i][j] == 0){ isthem[i][j] = 1; q.push({i, j}); } return nxt[i][j][t] = {i, j}; } if (vst[ii][jj][tt] == luot) { return nxt[i][j][t] = {-1, -1}; } else if (vst[ii][jj][tt] > 0 && vst[ii][jj][tt] != luot) { return nxt[i][j][t] = dfs(ii, jj, tt); } else { return nxt[i][j][t] = dfs(ii, jj, tt); } vst[i][j][t] = luot; } pii bdau[10]; ll idx[N][N]; // idx cua dinh i j pii dinh[N * N]; ll cur = 0; bool thuoc[N][N]; void dfs2(ll i, ll j) { cur ++ ; idx[i][j] = cur; dinh[cur] = {i, j}; thuoc[i][j] = 1; for (int z = 0; z < 4; z ++) { pii moi = nxt[i][j][z]; if (moi.fi != 0 && moi.fi != -1) { if (thuoc[moi.fi][moi.se] == 0) { dfs2(moi.fi, moi.se); } } if (moi.fi != i || moi.se != j) { adj[idx[i][j]].push_back({idx[moi.fi][moi.se]}); } } } ll ax[N]; // ax[mask] la mask 000101..1001 co chi so la bao nhieu ll ax1[N]; // ax[k] = mask ll k; ll check(ll mask1, ll mask2) { ll mask = (mask1 & mask2); if (mask != 0) { // co bit chung return 0; } mask = (mask1 ^ mask2); bool flag = 1; ll sd = 0; for (int i = 1; i <= n; i ++) { if (getbit(mask, i - 1) == 0) continue; ll j = i; while (j <= n && getbit(mask, j - 1) == 1) { j ++ ; } i = j - 1; sd ++ ; } if (sd > 1) { flag = 0; } if (flag == 0) return 0; return ax[mask]; } void dij() { vector<vector<ll>> d(cur + 1, vector<ll>(k + 1)); for (int i = 1; i <= cur; i ++) { for (int j = 1; j <= k; j ++) { d[i][j] = inf; } } priority_queue<pair<ll, pii>, vector<pair<ll, pii>>, greater<pair<ll, pii>>> pq; for (int i = 1; i <= n; i ++) { ll x = bdau[i].fi, y = bdau[i].se, mask = onbit(0, i - 1), id = ax[mask]; ll u = idx[x][y]; d[u][id] = 0; pq.push({d[u][id], {u, id}}); } while (pq.size()) { auto c = pq.top().fi; auto u = pq.top().se; pq.pop(); if (c > d[u.fi][u.se]) continue; //cout << endl; if (__builtin_popcount(ax1[u.se]) == n) { ans = min(ans, c); } ll mask = ax1[u.se]; for (int i = 1; i <= k; i ++) { if (i == u.se) continue; if (d[u.fi][i] == inf) continue; ll mask2 = ax1[i]; ll newid = check(mask, mask2); if (newid > 0 && d[u.fi][newid] > d[u.fi][u.se] + d[u.fi][i]) { d[u.fi][newid] = d[u.fi][u.se] + d[u.fi][i]; pq.push({d[u.fi][newid], {u.fi, newid}}); } } for (auto v : adj[u.fi]) { if (d[v][u.se] > c + 1) { d[v][u.se] = c + 1; pq.push({d[v][u.se], {v, u.se}}); } } } } void pre() { /*for (int i = 1; i <= n; i ++) { for (int z = 0; z < 4; z ++) { ++ luot; dfs(bdau[i].fi, bdau[i].se, z); } }*/ for (int i = 1; i <= n; i ++) { q.push({bdau[i].fi, bdau[i].se}); } while (q.size()) { auto u = q.front(); q.pop(); for (int z = 0; z < 4; z ++) { if (vst[u.fi][u.se][z] > 0) continue; ++ luot; dfs(u.fi, u.se, z); } } ////cout << nxt[1][1][0].fi << " " << nxt[1][1][0].se << endl;; ////cout << nxt[1][1][1].fi << " " << nxt[1][1][1].se << endl;; ////cout << nxt[1][1][2].fi << " " << nxt[1][1][2].se << endl;; for (int i = 1; i <= n; i ++) { dfs2(bdau[i].fi, bdau[i].se); } //cout << "cur " << cur << endl; //cout << nxt[5][5][1].fi << " " << nxt[5][5][1].se << endl; for (int mask = 0; mask < (1 << n); mask ++) { bool flag = 1; ll sd = 0; for (int i = 1; i <= n; i ++) { if (getbit(mask, i - 1) == 0) continue; ll j = i; while (j <= n && getbit(mask, j - 1) == 1) { j ++ ; } i = j - 1; sd ++ ; } if (sd > 1) { flag = 0; } if (flag) { k ++ ; ax[mask] = k; ax1[k] = mask; } } dij(); if (ans == inf) { cout << -1; } else { cout << ans; } } bool klinh; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> w >> h; for (int i = 1; i <= h; i ++) { for (int j = 1; j <= w; j ++) { cin >> a[i][j]; if ('1' <= a[i][j] && a[i][j] <= '9') { bdau[a[i][j] - '0'] = {i, j}; } } } pre(); cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...