Submission #1276913

#TimeUsernameProblemLanguageResultExecution timeMemory
1276913g4yuhgRobots (APIO13_robots)C++20
100 / 100
309 ms88132 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 * 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) {
	if (thuoc[i][j]) return;
	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[10][10], k;

ll d[500 * 500 + 1][46];
bool vis[500 * 500 + 1][46];

pii ptich[50];

vector<pii> p[N * N];

void dij() {
	queue<pii> q;
	for (int i = 1; i <= cur; i ++) {
		for (int j = 1; j <= k; j ++) {
			d[i][j] = inf;
		}
	}
	for (int i = 1; i <= n; i ++) {
		q.push({idx[bdau[i].fi][bdau[i].se], ax[i][i]});
		vis[idx[bdau[i].fi][bdau[i].se]][ax[i][i]] = 1;
		d[idx[bdau[i].fi][bdau[i].se]][ax[i][i]] = 0;
	}
	// lam tung len
	for (int len = 1; len <= n; len ++) {
		//cout << "len " << len << " " << q.size() << endl;
		if (len == 1) {
			while (q.size()) {
				auto u = q.front();
				q.pop();
				//cout << " " << d[u.fi][u.se] << " xy " << dinh[u.fi].fi << " " << dinh[u.fi].se << " | " << ptich[u.se].fi << " " << ptich[u.se].se << endl;
				for (auto v : adj[u.fi]) {
					if (d[v][u.se] > d[u.fi][u.se] + 1) {
						d[v][u.se] = d[u.fi][u.se] + 1;
						q.push({v, u.se});
					}
				}
			}
			continue;
		}
		ll mn = inf;
		for (int u = 1; u <= cur; u ++) {
			for (int i = 1; i <= n; i ++) {
				ll j = i + len - 1;
				if (j > n) break;
				for (int mid = i; mid < j; mid ++) {
					d[u][ax[i][j]] = min(d[u][ax[i][j]], d[u][ax[i][mid]] + d[u][ax[mid + 1][j]]);
				}
				mn = min(mn, d[u][ax[i][j]]);
				if (d[u][ax[i][j]] != inf) {
					p[d[u][ax[i][j]]].push_back({u, ax[i][j]});
					//cout << " push " << d[u][ax[i][j]] << " | " << dinh[u].fi << " " << dinh[u].se << " | " << i << " " << j << endl; 
				}
			}
		}
		if (mn == inf) {
			//cout << " cut" << endl;
			continue;
		}
		for (auto it : p[mn]) {
			q.push(it);
			vis[it.fi][it.se] = 1;
		}
		while (q.size()) {
			auto u = q.front();
			q.pop();
			//cout << " " << d[u.fi][u.se] << " xy " << dinh[u.fi].fi << " " << dinh[u.fi].se << " | " << ptich[u.se].fi << " " << ptich[u.se].se << endl;
			ll c = d[u.fi][u.se];
			for (auto it : p[c + 1]) {
				if (d[it.fi][it.se] < c + 1) continue;
				q.push({it.fi, it.se});
			}
			p[c + 1].clear();
			for (auto v : adj[u.fi]) {
				if (d[v][u.se] > c + 1) {
					d[v][u.se] = c + 1;
					q.push({v, u.se});
					vis[v][u.se] = 1;
				}
			}
		}
	}
}

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);
	}
	
	for (int i = 1; i <= n; i ++) {
		for (int j = i; j <= n; j ++) {
			ax[i][j] = ++ k;
			ptich[k] = {i, j};
		}
	}
	
	dij();
	
	for (int u = 1; u <= cur; u ++) {
		ans = min(ans, d[u][ax[1][n]]);
	}
	
	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...