# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
108930 |
2019-05-03T01:07:40 Z |
nxteru |
Robots (APIO13_robots) |
C++14 |
|
62 ms |
65080 KB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double D;
typedef pair<int,int> P;
#define M 1000000007
#define F first
#define S second
#define PB push_back
#define INF 2500000
struct t{
int l,r,y,x;
};
int h,w,n,dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},m[505][505],dp[9][9][505][505],ans=INF;
vector<P>g[505][505];
vector<t>q[2500000];
void dfs(int y,int x,int d,int py,int px){
g[y][x].PB(P(py,px));
if(m[y][x]==2)d+=3;
if(m[y][x]==3)d++;
d%=4;
int ny=y+dy[d],nx=x+dx[d];
if(0<=ny&&ny<h&&0<=nx&&nx<w&&m[ny][nx]!=1)dfs(ny,nx,d,py,px);
}
int main(void){
scanf("%d%d%d",&n,&w,&h);
for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int y=0;y<h;y++)for(int x=0;x<w;x++)dp[i][j][y][x]=INF;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
char c;
scanf(" %c",&c);
if(c=='x')m[i][j]=1;
else if(c=='A')m[i][j]=2;
else if(c=='C')m[i][j]=3;
else if(c!='.'){
int p=c-'1';
dp[p][p][i][j]=0;
}
}
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(m[i][j]==1)continue;
for(int k=0;k<4;k++){
int ny=i+dy[k],nx=j+dx[k];
if(nx<0||nx>=w||ny<0||ny>=h||m[ny][nx]==1){
dfs(i,j,(k+2)%4,i,j);
}
}
}
}
for(int k=0;k+1<n;k++){
int mn=INF,mx=-1;
for(int l=0;l+k<n;l++){
int r=l+k;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int d=dp[l][r][i][j];
if(d!=INF){
q[d].PB(t{d,l,i,j});
mn=min(mn,d);
mx=max(mx,d);
}
}
}
}
queue<t>bfs;
while(mn<=mx||!bfs.empty()){
if(bfs.empty()||(mn<=mx&&mn==bfs.front().l)){
for(int i=0;i<q[mn].size();i++)bfs.push(q[mn][i]);
q[mn].clear();
mn++;
}
int c=bfs.front().l,r=bfs.front().r,y=bfs.front().y,x=bfs.front().x;
bfs.pop();
for(int i=0;i<g[y][x].size();i++){
int ny=g[y][x][i].F,nx=g[y][x][i].S;
if(dp[r][r+k][ny][nx]==-1){
dp[r][r+k][ny][nx]=c+1;
bfs.push(t{c+1,r,ny,nx});
}
}
}
for(int l=0;l+k+1<n;l++){
int r=l+k+1;
for(int w=l;w<r;w++){
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
dp[l][r][i][j]=min(dp[l][r][i][j],dp[l][w][i][j]+dp[w+1][r][i][j]);
}
}
}
}
}
for(int i=0;i<h;i++)for(int j=0;j<w;j++)ans=min(ans,dp[0][n-1][i][j]);
if(ans==INF)ans=-1;
printf("%d\n",ans);
}
Compilation message
robots.cpp: In function 'int main()':
robots.cpp:70:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<q[mn].size();i++)bfs.push(q[mn][i]);
~^~~~~~~~~~~~~
robots.cpp:76:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<g[y][x].size();i++){
~^~~~~~~~~~~~~~~
robots.cpp:26:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d",&n,&w,&h);
~~~~~^~~~~~~~~~~~~~~~~~~
robots.cpp:31:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %c",&c);
~~~~~^~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
62 ms |
65080 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
62 ms |
65080 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
62 ms |
65080 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
62 ms |
65080 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |