機械人移動學會(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輸出樣例#1: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
12
#include#include#include#includeusing namespace std;
//障礙,最短路,長,寬,終點行列
int map[55][55],d[55][55][4],n,m,tr,tc;
char*dirs ="nesw";//順時針
int dr=;
int dc=;
struct node; //定義狀態:行,列,方向
node s; //起點
queueq;
bool find(node u) //到達終點
bool ok(node u) //移動合法(注意不能移到牆壁旁)
void bfs()
//特殊資料判斷
q.push(s);
while(!q.empty())
//left
v.dir=(z+3)%4;
if(d[v.r][v.c][v.dir]==-1)
//one
v.r=x+dr[z]; v.c=y+dc[z]; v.dir=z;
if(ok(v)&&d[v.r][v.c][v.dir]==-1)
cin>>s.r>>s.c>>tr>>tc;
dowhile(ch==' ');
s.dir=strchr(dirs,ch)-dirs;
bfs();
return 0;
}
P1126 機械人搬重物
includeusing namespace std const int inf 1000000000 int a 55 55 int sx,sy,ex,ey int n,m int mincnt inf int vis 100 100 mapmp struct node void bfs node...
P1126 機械人搬重物
機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n times mn m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受...
P1126 機械人搬重物
這道題本來沒啥好說的,但細節實在比較多,被坑了好多次。首先輸入的是格仔圖,需要轉化成點圖,具體操作是a i j a i 1 j 1 a i j 1 a i 1 j 1 最坑的乙個點在於,平時寫寬搜的時候,遇到出邊界或者不能訪問的點時,都是直接進入下一層迴圈 continue 但在這道題中,由於可以走...