题目描述
有一块n*m的地,每块地要么长满杂草(用'
W'表示),要么是空地(用'
G'表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:
2、向下移动一格,并反转面朝的方向(右变左,左变右),耗费1单位时间
现在他想知道清除所有的杂草最少需要多少单位时间(清除完杂草之后不用返回(1,1))
输入描述:
第一行n,m 接下来n行每行一个字符串表示矩阵。 n,m<=150
输出描述:
一行一个整数表示答案。
示例1
输入
4 5 GWGGW GGWGG GWGGG WGGGG
输出
11
示例2
输入
3 3 GWW WWW WWG
输出
7
解题思路:
1.从左上角第一个格子开始走,如果本行有杂草地那么最短路线中必须先将本行走完
2.然后当转到奇数行时,该从右向左查找杂草地,然后偶数行时从左向右
3.找到杂草地后,计算从上一个杂草地到这个杂草地走了多远并且加到总步数中
示例代码:
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
int main(){
int row,col;
scanf("%d %d",&row,&col);
char arrayMap[150][150];
for(int i=0;i<row;i++){
scanf("%s",arrayMap[i]);
}
//进行查找
int judge[150];//用于记录每行是否存在杂草
int number=0;//记录步数
int preRow=1,preCol=1;//记录上一个杂草的位置 行和列
for(int i=0;i<row;i++){
if(i%2!=0){//奇数行
for(int j=col-1;j>=0;j--){
if(arrayMap[i][j]=='W'){
judge[i] = 1;
number = number+abs(j+1-preCol); //找到杂草位置 加上所走的步数
preCol = j+1; //记录当前杂草位置的列
preRow = i+1;
//printf("%d %d\n",i,number);
}
}
}
else{//偶数行
for(int j=0;j<col;j++){
if(arrayMap[i][j]=='W'){
judge[i] = 1;
number = number+abs(j+1-preCol); //找到杂草位置 加上所走的步数
preCol = j+1; //记录当前杂草位置的列
preRow = i+1;
//printf("%d %d\n",i,number);
}
}
}
if(i!=(row-1))
number++;//向下走一格 步数加一
}
for(int i=row-1;i>=0;i--){
if (judge[i]==1)
{
break;
}
else{
if(number>0)
number--;
else
number=0;
}
}
printf("%d\n",number);
return 0;
}