日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器人搬重物(洛谷-P1126)

發布時間:2025/3/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器人搬重物(洛谷-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。