답안 #385534

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385534 2021-04-04T14:37:55 Z ogibogi2004 로봇 (APIO13_robots) C++14
30 / 100
181 ms 136612 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[502][502][4];
vector<pair<pair<short,short>,char> >g[502][502][4];
vector<pair<short,short> >g1[502][502];
char table[502][502];
short r,n,m;
vector<pair<pair<short,short>,char> >ends;
pair<pair<short,short>,char> actual_nxt[502][502][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[37][502][502];
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 21 ms 29932 KB Output is correct
2 Correct 21 ms 29932 KB Output is correct
3 Correct 22 ms 29932 KB Output is correct
4 Correct 21 ms 30188 KB Output is correct
5 Correct 22 ms 30336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 29932 KB Output is correct
2 Correct 21 ms 29932 KB Output is correct
3 Correct 22 ms 29932 KB Output is correct
4 Correct 21 ms 30188 KB Output is correct
5 Correct 22 ms 30336 KB Output is correct
6 Correct 21 ms 30060 KB Output is correct
7 Correct 22 ms 30080 KB Output is correct
8 Correct 22 ms 30060 KB Output is correct
9 Correct 21 ms 30060 KB Output is correct
10 Correct 21 ms 30208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 29932 KB Output is correct
2 Correct 21 ms 29932 KB Output is correct
3 Correct 22 ms 29932 KB Output is correct
4 Correct 21 ms 30188 KB Output is correct
5 Correct 22 ms 30336 KB Output is correct
6 Correct 21 ms 30060 KB Output is correct
7 Correct 22 ms 30080 KB Output is correct
8 Correct 22 ms 30060 KB Output is correct
9 Correct 21 ms 30060 KB Output is correct
10 Correct 21 ms 30208 KB Output is correct
11 Runtime error 181 ms 136612 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 29932 KB Output is correct
2 Correct 21 ms 29932 KB Output is correct
3 Correct 22 ms 29932 KB Output is correct
4 Correct 21 ms 30188 KB Output is correct
5 Correct 22 ms 30336 KB Output is correct
6 Correct 21 ms 30060 KB Output is correct
7 Correct 22 ms 30080 KB Output is correct
8 Correct 22 ms 30060 KB Output is correct
9 Correct 21 ms 30060 KB Output is correct
10 Correct 21 ms 30208 KB Output is correct
11 Runtime error 181 ms 136612 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -