机器人搬重物(洛谷-P1126)
題目描述
機器人移動學會(RMI)現在正嘗試用機器人搬運物品。機器人的形狀是一個直徑1.6米的球。在試驗階段,機器人被用于在一個儲藏室中搬運貨物。儲藏室是一個N*M的網格,有些格子為不可移動的障礙。機器人的中心總是在格點上,當然,機器人必須在最短的時間內把物品搬運到指定的地方。機器人接受的指令有:向前移動1步(Creep);向前移動2步(Walk);向前移動3步(Run);向左轉(Left);向右轉(Right)。每個指令所需要的時間為1秒。請你計算一下機器人完成任務所需的最少時間。
輸入輸出格式
輸入格式:
輸入的第一行為兩個正整數N,M(N,M<=50),下面N行是儲藏室的構造,0表示無障礙,1表示有障礙,數字之間用一個空格隔開。接著一行有四個整數和一個大寫字母,分別為起始點和目標點左上角網格的行與列,起始時的面對方向(東E,南S,西W,北N),數與數,數與字母之間均用一個空格隔開。終點的面向方向是任意的。
輸出格式:
一個整數,表示機器人完成任務所需的最少時間。如果無法到達,輸出-1。
輸入輸出樣例
輸入樣例#1:
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S
輸出樣例#1:
12
源代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define INF 999999999 #define N 10001 using namespace std; int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}}; bool map[51][51]; int vis[51][51]; int head=1,tail; struct node{int x;int y;int dir;int step; }a[N]; int ans[5001]={-1}; int main() {int n,m;cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){bool a;cin>>a;if(a){map[i][j]=1;map[i-1][j-1]=1;map[i-1][j]=1;map[i][j-1]=1;}}for(int i=1;i<=n;i++){map[n][i]=1;map[i][m]=1;}int sx,sy,ex,ey;char sdir;cin>>sx>>sy>>ex>>ey>>sdir;/*預處理*/a[++tail].x=sx;a[tail].y=sy;a[tail].step=0;if(sdir=='E')a[tail].dir=1;if(sdir=='W')a[tail].dir=2;if(sdir=='S')a[tail].dir=3;if(sdir=='N')a[tail].dir=4;memset(vis,1,sizeof(vis));int tot=0;int minl=INF;while(head<=tail)//搜索{if(a[head].x==ex&&a[head].y==ey)ans[++tot]=a[head].step;for(int i=1;i<=4;i++){int step=a[head].step;if(i!=a[head].dir)//如果方向不一樣,則需轉彎,步數加一{step=a[head].step+1;if((i==1&&a[head].dir==2)||(i==2&&a[head].dir==1)||(i==3&&a[head].dir==4)||(i==4&&a[head].dir==3)) //如果向后轉,需要轉兩次彎step=a[head].step+2;}for(int j=1;j<=3;j++)//枚舉步數{int xx=a[head].x+j*dir[i][0];int yy=a[head].y+j*dir[i][1];if(xx>n||xx<1||yy>m||yy<=0||map[xx][yy])break;if(vis[xx][yy]>step)//保存最優解{a[++tail].x=xx;a[tail].y=yy;a[tail].step=step+1;a[tail].dir=i;vis[xx][yy]=step;}}}head++;}for(int i=1;i<=tot;i++) //尋找最優解{if(ans[i]<minl)minl=ans[i];}if(minl<INF)cout<<minl;elsecout<<-1;return 0; }?
總結
以上是生活随笔為你收集整理的机器人搬重物(洛谷-P1126)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++语言基础 —— STL —— 容器
- 下一篇: 分解因数(信息学奥赛一本通-T1200)