답안 #385484

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385484 2021-04-04T13:23:45 Z ogibogi2004 로봇 (APIO13_robots) C++14
60 / 100
1044 ms 163844 KB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("O3")
#pragma GCC target ("fma,avx,avx2")
#define ends dfdsfdsf
const int INF=1e8;
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[10][10][512][512];
pair<int,int> where[10];
int main()
{
	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[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[i][i][x][y]=0;
		while(!q.empty())
		{
			tie(x,y)=q.front();
			q.pop();
			for(auto xd:g1[x][y])
			{
				if(dp[i][i][xd.first][xd.second]>dp[i][i][x][y]+1)
				{
					dp[i][i][xd.first][xd.second]=dp[i][i][x][y]+1;
					q.push(xd);
				}
			}
		}
	}
	priority_queue<pair<int,pair<int,int> > >pq;
	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[r1][r2][i][j]=min(dp[r1][r2][i][j],dp[r1][mid][i][j]+dp[mid+1][r2][i][j]);
					}
				}
			}
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=m;++j)
				{
					pq.push({-dp[r1][r2][i][j],{i,j}});
				}
			}
			while(!pq.empty())
			{
				int x,y;
				int t;
				t=pq.top().first;
				tie(x,y)=pq.top().second;
				pq.pop();
				if(t!=-dp[r1][r2][x][y])continue;
				for(auto xd:g1[x][y])
				{
					if(dp[r1][r2][x][y]+1<dp[r1][r2][xd.first][xd.second])
					{
						dp[r1][r2][xd.first][xd.second]=dp[r1][r2][x][y]+1;
						pq.push({-dp[r1][r2][xd.first][xd.second],{xd}});
					}
				}
			}
		}
	}
	/*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[1][r][i][j]);
		}
	}
	if(ans==INF)cout<<"-1\n";
	else cout<<ans<<endl;
return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 31212 KB Output is correct
2 Correct 23 ms 31092 KB Output is correct
3 Correct 22 ms 31192 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 23 ms 31340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 31212 KB Output is correct
2 Correct 23 ms 31092 KB Output is correct
3 Correct 22 ms 31192 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 23 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 22 ms 31212 KB Output is correct
8 Correct 22 ms 31212 KB Output is correct
9 Correct 26 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 31212 KB Output is correct
2 Correct 23 ms 31092 KB Output is correct
3 Correct 22 ms 31192 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 23 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 22 ms 31212 KB Output is correct
8 Correct 22 ms 31212 KB Output is correct
9 Correct 26 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 715 ms 99844 KB Output is correct
12 Correct 65 ms 49312 KB Output is correct
13 Correct 418 ms 83232 KB Output is correct
14 Correct 1044 ms 99744 KB Output is correct
15 Correct 705 ms 99744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 31212 KB Output is correct
2 Correct 23 ms 31092 KB Output is correct
3 Correct 22 ms 31192 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 23 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 22 ms 31212 KB Output is correct
8 Correct 22 ms 31212 KB Output is correct
9 Correct 26 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 715 ms 99844 KB Output is correct
12 Correct 65 ms 49312 KB Output is correct
13 Correct 418 ms 83232 KB Output is correct
14 Correct 1044 ms 99744 KB Output is correct
15 Correct 705 ms 99744 KB Output is correct
16 Runtime error 362 ms 163844 KB Execution killed with signal 9
17 Halted 0 ms 0 KB -