割草机

来源:互联网 发布:网络主播搞笑语录 编辑:程序博客网 时间:2024/05/09 04:53

题目描述

有一块n*m的地,每块地要么长满杂草(用'W'表示),要么是空地(用'G'表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动: 

1、向面朝的方向移动一格,耗费1单位时间

2、向下移动一格,并反转面朝的方向(右变左,左变右),耗费1单位时间

现在他想知道清除所有的杂草最少需要多少单位时间(清除完杂草之后不用返回(1,1))

输入描述:

第一行n,m接下来n行每行一个字符串表示矩阵。n,m<=150

输出描述:

一行一个整数表示答案。
示例1

输入

4 5GWGGWGGWGGGWGGGWGGGG

输出

11
示例2

输入

3 3GWWWWWWWG

输出

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;}



原创粉丝点击