Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
179851 | A班石婧予 | 机器人搬重物 | C++ | 通过 | 100 | 1 MS | 312 KB | 1932 | 2024-08-21 12:53:40 |
#include<bits/stdc++.h> using namespace std; int sd[55][55]; int a[55][55]; int n,m; int x11,y11; int x2,y2; int f[55][55]; int fx[5]={0,-1,1,0,0}; int fy[5]={0,0,0,-1,1}; int ft[5]={0,1,4,2,3}; int fft[5]={0,1,3,4,2}; int abc[5]={0,1,2,1,0}; struct node { int x,y; int t; int time; }; queue<node> q; string ch; int cto; void fxto() { switch(ch[0]) { case 'N': cto=1;break; case 'S': cto=2;break; case 'W': cto=3;break; case 'E': cto=4;break; } return; } void change() { for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(sd[i][j]==1) { a[i-1][j]=1; a[i][j-1]=1; a[i-1][j-1]=1; a[i][j]=1; } } } } int main() { cin>>n>>m; for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&sd[i][j]); } } cin>>x11>>y11>>x2>>y2; cin>>ch; fxto(); change(); node first; first.x=x11; first.y=y11; first.t=cto; first.time=0; q.push(first); node u,d; while(!q.empty()) { u=q.front(); q.pop(); for(int i=1;i<=4;++i) { int zhuan=abc[i]; int fangx=fft[u.t]+i; if(fangx==5) fangx=1; if(fangx==6) fangx=2; if(fangx==7) fangx=3; if(fangx==8) fangx=4; fangx=ft[fangx]; for(int j=1;j<=3;++j) { int lsx=u.x+fx[fangx]*j; int lsy=u.y+fy[fangx]*j; if(lsx>=n || lsx<=0 || lsy>=m || lsy<=0 || (lsx==x11&&lsy==y11) || a[lsx][lsy]==1) { break; } if((u.time+zhuan+1<f[u.x+fx[fangx]*j][u.y+fy[fangx]*j] || f[u.x+fx[fangx]*j][u.y+fy[fangx]*j]==0) && a[u.x+fx[fangx]*j][u.y+fy[fangx]*j]==0) { d.x=u.x+fx[fangx]*j; d.y=u.y+fy[fangx]*j; d.t=fangx; d.time=u.time+zhuan+1; f[u.x+fx[fangx]*j][u.y+fy[fangx]*j]=d.time; q.push(d); } } } } if(f[x2][y2]==0 && (x2!=x11 || y2!=y11)) { cout<<"-1"<<endl; } else cout<<f[x2][y2]<<endl; return 0; }