제출 #1329611

#제출 시각아이디문제언어결과실행 시간메모리
1329611MuhammadSaramKraljica (COCI25_kraljica)C++20
24 / 110
5098 ms193192 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'
#define int long long

const int M = 4e6 + 1;

vector<int> nei[M];
int dis[M];

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);

	int n,m;
	cin>>n>>m;
	string a[n];
	int ind[n][m][4], id=0;// r c \ /
	vector<int> v[10];
	deque<int> q;
	vector<int> e;
	for (int i=0;i<M;i++) dis[i]=M*2;
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
		for (int j=0;j<m;j++)
		{
			if (a[i][j]=='#') continue;
			if (!j or a[i][j-1]=='#') ind[i][j][0]=id++;
			else ind[i][j][0]=ind[i][j-1][0];
			if (!i or a[i-1][j]=='#') ind[i][j][1]=id++;
			else ind[i][j][1]=ind[i-1][j][1];
			if (!i or !j or a[i-1][j-1]=='#') ind[i][j][2]=id++;
			else ind[i][j][2]=ind[i-1][j-1][2];
			if (!i or j==m-1 or a[i-1][j+1]=='#') ind[i][j][3]=id++;
			else ind[i][j][3]=ind[i-1][j+1][3];
			for (int k=0;k<4;k++)
			{
				if (a[i][j]=='S') q.push_back(ind[i][j][k]), dis[ind[i][j][k]]=0;
				else if (a[i][j]=='E') e.push_back(ind[i][j][k]);
				else if(a[i][j]!='.')
				{
					if (v[a[i][j]-'0'].size()>=4)
					{
						for (int l=0;l<4;l++)
							nei[v[a[i][j]-'0'][l]].push_back(ind[i][j][k]),
							nei[ind[i][j][k]].push_back(v[a[i][j]-'0'][l]);
					}
					else
						v[a[i][j]-'0'].push_back(ind[i][j][k]);
				}
				for (int l=0;l<4;l++)
					nei[ind[i][j][k]].push_back(ind[i][j][l]);
			}
		}
	}
	while (!q.empty())
	{
		int u=q.front();q.pop_front();
		for (int v:nei[u])
			if (dis[v]>dis[u]+1)
				dis[v]=dis[u]+1, q.push_front(v);
	}
	int ans=M*2;
	for (int i:e)
		ans=min(ans,dis[i]);
	if (ans==M*2) ans=-2;
	cout<<ans+1<<endl;

	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...
#Verdict Execution timeMemoryGrader output
Fetching results...