• 割草机


    题目描述

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

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

    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
    ",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
    ",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
    ",number);
        return 0;
    }



  • 相关阅读:
    前后端分离实践 — 如何解决跨域问题
    bower 和 npm 的区别详细介绍
    yeoman-bower-grunt之间的关系
    软件开发环境-开发环境、测试环境、生产环境的区别
    Tomcat下配置JNDI的三种方式
    SSE
    Java动态代理
    Css之Relative
    多线程之——死锁
    JVM
  • 原文地址:https://www.cnblogs.com/chxuan/p/8232090.html
Copyright © 2020-2023  润新知