답안 #385507

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385507 2021-04-04T13:54:18 Z ogibogi2004 로봇 (APIO13_robots) C++14
60 / 100
1500 ms 127212 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<short,short>,char> nxt[512][512][4];
vector<pair<pair<short,short>,char> >g[512][512][4];
vector<pair<short,short> >g1[512][512];
char table[512][512];
short r,n,m;
vector<pair<pair<short,short>,char> >ends;
pair<pair<short,short>,char> 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<short,short>,char> >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<short,short> >q;
	for(int i=1;i<=r;++i)
	{
		short 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);
				}
			}
		}
	}
	priority_queue<pair<int,pair<short,short> > >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[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]);
					}
				}
			}
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=m;++j)
				{
					if(dp[c(r1,r2)][i][j]<INF)pq.push({-dp[c(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[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;
						pq.push({-dp[c(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[c(1,r)][i][j]);
		}
	}
	if(ans==INF)cout<<"-1\n";
	else 
	{
		cout<<ans<<endl;
	}
return 0;
}

Compilation message

robots.cpp: In function 'int main()':
robots.cpp:88:73: warning: array subscript has type 'char' [-Wchar-subscripts]
   88 |     g[nxt[i][j][l].first.first][nxt[i][j][l].first.second][nxt[i][j][l].second].push_back({{i,j},l});
      |                                                            ~~~~~~~~~~~~~^~~~~~
robots.cpp:96:50: warning: array subscript has type 'char' [-Wchar-subscripts]
   96 |   actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
      |                                               ~~~^~~~~~
robots.cpp:102:50: warning: array subscript has type 'char' [-Wchar-subscripts]
  102 |   for(auto xd:g[u.first.first][u.first.second][u.second])
      |                                                ~~^~~~~~
robots.cpp:104:51: warning: array subscript has type 'char' [-Wchar-subscripts]
  104 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                ~~~^~~~~~
robots.cpp:104:103: warning: array subscript has type 'char' [-Wchar-subscripts]
  104 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                                                                     ~~^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 25 ms 31340 KB Output is correct
5 Correct 26 ms 31340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 25 ms 31340 KB Output is correct
5 Correct 26 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 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 25 ms 31340 KB Output is correct
5 Correct 26 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 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 185 ms 73508 KB Output is correct
12 Correct 65 ms 46500 KB Output is correct
13 Correct 75 ms 65060 KB Output is correct
14 Correct 618 ms 74020 KB Output is correct
15 Correct 130 ms 73124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 25 ms 31340 KB Output is correct
5 Correct 26 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 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 185 ms 73508 KB Output is correct
12 Correct 65 ms 46500 KB Output is correct
13 Correct 75 ms 65060 KB Output is correct
14 Correct 618 ms 74020 KB Output is correct
15 Correct 130 ms 73124 KB Output is correct
16 Correct 379 ms 127212 KB Output is correct
17 Execution timed out 1596 ms 114208 KB Time limit exceeded
18 Halted 0 ms 0 KB -