답안 #385494

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385494 2021-04-04T13:39:50 Z ogibogi2004 로봇 (APIO13_robots) C++14
30 / 100
143 ms 103968 KB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("O3")
#pragma GCC target ("fma,avx,avx2")
#define ends dfdsfdsf
const int INF=1000002;
pair<pair<int,int>,int> nxt[512][512][4];
vector<pair<pair<int,int>,int> >g[512][512][4];
vector<pair<int,int> >g1[512][512];
char table[512][512];
int r,n,m;
vector<pair<pair<int,int>,int> >ends;
pair<pair<int,int>,int> actual_nxt[512][512][4];
bool not_valid(pair<int,int> p)
{
	int x=p.first,y=p.second;
	if(x<1||y<1||x>n||y>m)return 1;
	return table[x][y]=='x';
}
int dp[45][512][512];
pair<int,int> where[10];
int number[10][10];
int c(int x,int y)
{
	return number[x][y];
}
void pre()
{
	int cnt=0;
	for(int i=1;i<=9;++i)
	{
		for(int j=i;j<=9;++j)
		{
			number[i][j]=++cnt;
		}
	}
}
int main()
{
	pre();
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>r>>m>>n;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			cin>>table[i][j];
			if(isdigit(table[i][j]))
			{
				where[table[i][j]-'0']={i,j};
			}
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			if(table[i][j]=='x')continue;
			if(table[i][j]=='A')
			{
				nxt[i][j][0]={{i,j-1},3};
				nxt[i][j][1]={{i-1,j},0};
				nxt[i][j][2]={{i,j+1},1};
				nxt[i][j][3]={{i+1,j},2};
			}
			else if(table[i][j]=='C')
			{
				nxt[i][j][0]={{i,j+1},1};
				nxt[i][j][1]={{i+1,j},2};
				nxt[i][j][2]={{i,j-1},3};
				nxt[i][j][3]={{i-1,j},0};
			}
			else
			{
				nxt[i][j][0]={{i-1,j},0};
				nxt[i][j][1]={{i,j+1},1};
				nxt[i][j][2]={{i+1,j},2};
				nxt[i][j][3]={{i,j-1},3};
			}
			for(int l=0;l<4;++l)
			{
				if(not_valid(nxt[i][j][l].first))
				{
					ends.push_back({{i,j},l});
				}
				g[nxt[i][j][l].first.first][nxt[i][j][l].first.second][nxt[i][j][l].second].push_back({{i,j},l});
			}
		}
	}
	queue<pair<pair<int,int>,int> >qq;
	for(auto xd:ends)
	{
		qq.push(xd);
		actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
	}
	while(!qq.empty())
	{
		auto u=qq.front();
		qq.pop();
		for(auto xd:g[u.first.first][u.first.second][u.second])
		{
			actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
			qq.push(xd);
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			for(int l=0;l<4;++l)
			{
				int x,y,z;
				x=actual_nxt[i][j][l].first.first;
				y=actual_nxt[i][j][l].first.second;
				z=actual_nxt[i][j][l].second;
				if(x==i&&y==j&&z==l)continue;
				g1[i][j].push_back({x,y});
			}
		}
	}
	for(int r1=1;r1<=r;++r1)
	{
		for(int r2=1;r2<=r;++r2)
		{
			for(int i1=1;i1<=n;++i1)
			{
				for(int i2=1;i2<=m;++i2)
				{
					dp[c(r1,r2)][i1][i2]=INF;
				}
			}
		}
	}
	queue<pair<int,int> >q;
	for(int i=1;i<=r;++i)
	{
		int x,y;
		x=where[i].first;
		y=where[i].second;
		q.push({x,y});
		dp[c(i,i)][x][y]=0;
		while(!q.empty())
		{
			tie(x,y)=q.front();
			q.pop();
			for(auto xd:g1[x][y])
			{
				if(dp[c(i,i)][xd.first][xd.second]>dp[c(i,i)][x][y]+1)
				{
					dp[c(i,i)][xd.first][xd.second]=dp[c(i,i)][x][y]+1;
					q.push(xd);
				}
			}
		}
	}
	vector<pair<int,pair<int,int> > >pq[INF];
	for(int len=2;len<=r;++len)
	{
		for(int r1=1;r1+len-1<=r;++r1)
		{
			int r2=r1+len-1;
			for(int mid=r1;mid<r2;++mid)
			{
				for(int i=1;i<=n;++i)
				{
					for(int j=1;j<=m;++j)
					{
						dp[c(r1,r2)][i][j]=min(dp[c(r1,r2)][i][j],dp[c(r1,mid)][i][j]+dp[c(mid+1,r2)][i][j]);
					}
				}
			}
			int maxdp=0;
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=m;++j)
				{
					if(dp[c(r1,r2)][i][j]<INF)
					{
						pq[dp[c(r1,r2)][i][j]].push_back({dp[c(r1,r2)][i][j],{i,j}});
						maxdp=max(maxdp,dp[c(r1,r2)][i][j]);
					}
				}
			}
			for(int f=0;f<=maxdp;f++)
			{
			for(auto qw:pq[f])
			{
				int x,y;
				int t;
				t=qw.first;
				tie(x,y)=qw.second;
				if(t!=-dp[c(r1,r2)][x][y])continue;
				for(auto xd:g1[x][y])
				{
					if(dp[c(r1,r2)][x][y]+1<dp[c(r1,r2)][xd.first][xd.second])
					{
						dp[c(r1,r2)][xd.first][xd.second]=dp[c(r1,r2)][x][y]+1;
						if(dp[c(r1,r2)][xd.first][xd.second]<INF)pq[dp[c(r1,r2)][xd.first][xd.second]].push_back({-dp[c(r1,r2)][xd.first][xd.second],{xd}});
					}
				}
			}
			pq[f].clear();
			}
		}
	}
	/*for(int i1=1;i1<=r;i1++)
	{
		for(int i2=i1;i2<=r;i2++)
		{
			cout<<i1<<"-"<<i2<<endl;
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					if(dp[i1][i2][i][j]<INF)cout<<dp[i1][i2][i][j];
					else cout<<"x";
				}
				cout<<endl;
			}
		}
	}*/
	int ans=INF;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			ans=min(ans,dp[c(1,r)][i][j]);
		}
	}
	if(ans==INF)cout<<"-1\n";
	else cout<<ans<<endl;
return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 54636 KB Output is correct
2 Correct 37 ms 54636 KB Output is correct
3 Correct 37 ms 54636 KB Output is correct
4 Correct 42 ms 54764 KB Output is correct
5 Correct 38 ms 54824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 54636 KB Output is correct
2 Correct 37 ms 54636 KB Output is correct
3 Correct 37 ms 54636 KB Output is correct
4 Correct 42 ms 54764 KB Output is correct
5 Correct 38 ms 54824 KB Output is correct
6 Correct 37 ms 54636 KB Output is correct
7 Correct 38 ms 54636 KB Output is correct
8 Correct 37 ms 54636 KB Output is correct
9 Correct 37 ms 54636 KB Output is correct
10 Correct 39 ms 54764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 54636 KB Output is correct
2 Correct 37 ms 54636 KB Output is correct
3 Correct 37 ms 54636 KB Output is correct
4 Correct 42 ms 54764 KB Output is correct
5 Correct 38 ms 54824 KB Output is correct
6 Correct 37 ms 54636 KB Output is correct
7 Correct 38 ms 54636 KB Output is correct
8 Correct 37 ms 54636 KB Output is correct
9 Correct 37 ms 54636 KB Output is correct
10 Correct 39 ms 54764 KB Output is correct
11 Incorrect 143 ms 103968 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 54636 KB Output is correct
2 Correct 37 ms 54636 KB Output is correct
3 Correct 37 ms 54636 KB Output is correct
4 Correct 42 ms 54764 KB Output is correct
5 Correct 38 ms 54824 KB Output is correct
6 Correct 37 ms 54636 KB Output is correct
7 Correct 38 ms 54636 KB Output is correct
8 Correct 37 ms 54636 KB Output is correct
9 Correct 37 ms 54636 KB Output is correct
10 Correct 39 ms 54764 KB Output is correct
11 Incorrect 143 ms 103968 KB Output isn't correct
12 Halted 0 ms 0 KB -