某ACM题无限RuntimeError,求解救解决方法
某ACM题无限RuntimeError,求解救
Description
有一块 n × m的长方形(n,m分别表示行列)土地,上面只长有杂草和小麦。对于n × m个格子,每个格子只能长小麦或是杂草。例如下图4×5的长方形土地(空格表示小麦)
农民yanmie有一台剪草机,现在他想把所有的杂草给除掉。他从左上角的坐标(1,1)面对右边开始。每一步的走法具体如下:
可以朝yamie的面对的方向走一步。
•如果yanmie是朝右,可以从当前位置(r,c)走到(r,c+1);(如下图)
•如果yanmie是朝左,可以从当前位置(r,c)走到(r,c-1);(如下图)
可以向下走一步,也就是从当前位置(r,c)走到(r+1,c)。但每次向下走一步,yamie面对的方向就会变反,具体如下。
•如果之前是朝向右边,向下走一步就会变为朝向左。(如下图)
•如果之前是朝向左边的,向下走一步就会变位朝向右。(如下图)
现在农民yamie想知道走最少的步数把那些杂草铲除。注意:yamie不能走出这个长方形。
Input
第一行包含一个数T,表示有T组样例。每组样例后有两个整数n和m(1 ≤ n, m ≤ 150),分别表示行和列。然后是n行m列的字符,"G"表示小麦,"W"表示杂草。输入保证一开始左上角坐标为(1,1)的格子不是杂草。
Output
输出一个数 - 最少铲除杂草需要走的步数。
Sample Input
1
4 5
GWGGW
GGWGG
GWGGG
WGGGG
Sample Output
11
Hint
------解决方案--------------------
gcc4.2表示执行正确,没runtime
------解决方案--------------------
这个真没看出来。。。
Description
有一块 n × m的长方形(n,m分别表示行列)土地,上面只长有杂草和小麦。对于n × m个格子,每个格子只能长小麦或是杂草。例如下图4×5的长方形土地(空格表示小麦)
农民yanmie有一台剪草机,现在他想把所有的杂草给除掉。他从左上角的坐标(1,1)面对右边开始。每一步的走法具体如下:
可以朝yamie的面对的方向走一步。
•如果yanmie是朝右,可以从当前位置(r,c)走到(r,c+1);(如下图)
•如果yanmie是朝左,可以从当前位置(r,c)走到(r,c-1);(如下图)
可以向下走一步,也就是从当前位置(r,c)走到(r+1,c)。但每次向下走一步,yamie面对的方向就会变反,具体如下。
•如果之前是朝向右边,向下走一步就会变为朝向左。(如下图)
•如果之前是朝向左边的,向下走一步就会变位朝向右。(如下图)
现在农民yamie想知道走最少的步数把那些杂草铲除。注意:yamie不能走出这个长方形。
Input
第一行包含一个数T,表示有T组样例。每组样例后有两个整数n和m(1 ≤ n, m ≤ 150),分别表示行和列。然后是n行m列的字符,"G"表示小麦,"W"表示杂草。输入保证一开始左上角坐标为(1,1)的格子不是杂草。
Output
输出一个数 - 最少铲除杂草需要走的步数。
Sample Input
1
4 5
GWGGW
GGWGG
GWGGG
WGGGG
Sample Output
11
Hint
- C/C++ code
# include<stdio.h> # include<string.h> char map[200][200]; int n,m,l,num,d; //l为W的总数,其余下同 int rear,front; struct node { int p,d,val,num; //p为方向(1为右,-1为左,d为走了的步数,num为遇到W的个数,val是m*x+y的值) }queue[100000]; void bfs() { int u,x,y,p; queue[rear].val = 0; //(0,0)入队,方向为右 queue[rear].p = 1; queue[rear].num = 0; queue[rear++].d = 0; while(front<rear) { u = queue[front].val; //出队 p = queue[front].p; d = queue[front].d; num = queue[front++].num; x = u/m; y = u%m; if(num >= l) break; //清除所有草,则退出 if(y+1<=m-1 && p>0) //右走一步,方向为正,如果可行则入队 { if(map[x][y+1] == 'W')queue[rear].num = num+1; else queue[rear].num = num; queue[rear].val = m*x+y+1; queue[rear].d = d+1; queue[rear++].p = 1; } if(y-1>=0 && p<0) //左走一步 { if(map[x][y-1] == 'W')queue[rear].num = num+1; else queue[rear].num = num; queue[rear].val = m*x+y-1; queue[rear].d = d+1; queue[rear++].p = -1; } if(x+1<=n-1 && p>0) //下走一步方向为正 { if(map[x+1][y] == 'W')queue[rear].num = num+1; else queue[rear].num = num; queue[rear].val = m*(x+1)+y; queue[rear].d = d+1; queue[rear++].p = -1; } else if(x+1<=n-1 && p<0) //下走一步方向为负 { if(map[x+1][y] == 'W')queue[rear].num = num+1; else queue[rear].num = num; queue[rear].val = m*(x+1)+y; queue[rear].d = d+1; queue[rear++].p = 1; } } } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); rear = front = l = d = 0; memset(queue,0,sizeof(queue[0])); for(i=0;i<n;i++) { scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j] == 'W') l++; } } bfs(); printf("%d\n",d); } return 0; }
------解决方案--------------------
gcc4.2表示执行正确,没runtime
------解决方案--------------------
这个真没看出来。。。