标签:html bin style time 输入 pre c代码 upload 输入格式
机器人移动学会(RMI
)现在正尝试用机器人搬运物品。机器人的形状是一个直径$1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N×MN \times MN×M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动111步(Creep
);向前移动2步(Walk
);向前移动333步(Run
);向左转(Left
);向右转(Right
)。每个指令所需要的时间为111秒。请你计算一下机器人完成任务所需的最少时间。
输入格式:
第一行为两个正整数N,M(N,M≤50)N,M(N,M \le 50)N,M(N,M≤50),下面NNN行是储藏室的构造,000表示无障碍,111表示有障碍,数字之间用一个空格隔开。接着一行有444个整数和111个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东EEE,南SSS,西WWW,北NNN),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出?1-1?1。
思路:很不错的搜索题,用BFS,虐了我1天多才A掉 QAQ,细节很多。
1.每个状态包含行、列、方向、步数。
2.需要将格点图转换为点图。
3.注意边界不能走。
4.最后是折磨了大半天的,救赎最后输入的字符,我最开始是写的scanf("%d%d%d%d%c",&sr,&sc,&er,&ec,&d)。我一直在找算法部分的bug,怎么也没想到竟然是它没有读到输入的字符,而读的是空格。因为scanf虽然在读数据会吃掉空格和换行,但只有scanf读char时不会吃掉空格和换行,虽然以前碰到过一次,但还是没意识到啊...解决办法是在%c前加一个空格就行,吸取教训了,血的教训。
AC代码如下:
1 #include<cstdio> 2 #include<queue> 3 #include<iostream> 4 using namespace std; 5 6 struct cur{ 7 int r,c,dir,step; 8 }tmp; 9 queue<cur> q; 10 int gr[4][3]={{-1,-2,-3},{0,0,0},{1,2,3},{0,0,0}}; 11 int gc[4][3]={{0,0,0},{1,2,3},{0,0,0},{-1,-2,-3}}; 12 int n,m,sr,sc,er,ec; 13 int a[100][100]; 14 bool vis[100][100][5]; 15 16 void bfs(){ 17 q.push(tmp); 18 while(!q.empty()){ 19 cur now=q.front();q.pop(); 20 int nr=now.r,nc=now.c,nd=now.dir,ns=now.step; 21 if(nr==er&&nc==ec){ 22 printf("%d\n",ns); 23 return; 24 } 25 for(int i=0;i<3;i++){ 26 int rr=nr+gr[nd][i],cc=nc+gc[nd][i]; 27 if(rr<=0||cc<=0||rr>=n||cc>=m||a[rr][cc]) 28 break; 29 if(!vis[rr][cc][nd]){ 30 tmp.r=rr,tmp.c=cc,tmp.dir=nd,tmp.step=ns+1; 31 vis[rr][cc][nd]=true; 32 q.push(tmp); 33 } 34 } 35 for(int i=-1;i<=1;i+=2){ 36 tmp.r=nr,tmp.c=nc; 37 int dd=nd+i; 38 if(dd==4)dd=0; 39 if(dd==-1)dd=3; 40 tmp.dir=dd; 41 tmp.step=ns+1; 42 if(!vis[nr][nc][dd]){ 43 vis[nr][nc][dd]=true; 44 q.push(tmp); 45 } 46 } 47 } 48 printf("-1\n"); 49 } 50 51 int main(){ 52 int x; 53 char d; 54 scanf("%d%d",&n,&m); 55 for(int i=1;i<=n;i++) 56 for(int j=1;j<=m;j++){ 57 scanf("%d",&x); 58 if(x) 59 a[i][j]=a[i-1][j]=a[i-1][j-1]=a[i][j-1]=1; 60 } 61 scanf("%d%d%d%d",&sr,&sc,&er,&ec); 62 scanf(" %c",&d); 63 if(a[er][ec]){ 64 printf("-1\n"); 65 return 0; 66 } 67 tmp.r=sr,tmp.c=sc; 68 switch(d){ 69 case ‘N‘:tmp.dir=0;break; 70 case ‘E‘:tmp.dir=1;break; 71 case ‘S‘:tmp.dir=2;break; 72 case ‘W‘:tmp.dir=3; 73 } 74 tmp.step=0; 75 vis[sr][sc][tmp.dir]=true; 76 bfs(); 77 return 0; 78 }
标签:html bin style time 输入 pre c代码 upload 输入格式
原文地址:https://www.cnblogs.com/FrankChen831X/p/10326229.html