제출 #385536

#제출 시각아이디문제언어결과실행 시간메모리
385536ogibogi2004로봇 (APIO13_robots)C++14
30 / 100
163 ms141220 KiB
#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[37][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; }

컴파일 시 표준 에러 (stderr) 메시지

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];
      |                                                                                                     ~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...