답안 #385510

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385510 2021-04-04T13:57:56 Z ogibogi2004 로봇 (APIO13_robots) C++14
30 / 100
218 ms 73380 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;
mt19937 mt(2323);
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;
				if(mt()%70==0)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:89:73: warning: array subscript has type 'char' [-Wchar-subscripts]
   89 |     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:97:50: warning: array subscript has type 'char' [-Wchar-subscripts]
   97 |   actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
      |                                               ~~~^~~~~~
robots.cpp:103:50: warning: array subscript has type 'char' [-Wchar-subscripts]
  103 |   for(auto xd:g[u.first.first][u.first.second][u.second])
      |                                                ~~^~~~~~
robots.cpp:105:51: warning: array subscript has type 'char' [-Wchar-subscripts]
  105 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                ~~~^~~~~~
robots.cpp:105:103: warning: array subscript has type 'char' [-Wchar-subscripts]
  105 |    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 22 ms 31340 KB Output is correct
5 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 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31232 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 25 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 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31232 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 25 ms 31340 KB Output is correct
11 Incorrect 218 ms 73380 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 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 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31232 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 25 ms 31340 KB Output is correct
11 Incorrect 218 ms 73380 KB Output isn't correct
12 Halted 0 ms 0 KB -