题目描述

You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m grid, with rows numbered 11 to nn from top to bottom, and columns 11 to mm from left to right. Each cell is identified by a pair (r,c)(r,c)which means that the cell is located at row rr and column cc . Each cell may contain either grass or weeds. For example, a 4×54×5 garden may look as follows (empty cells denote grass):

You have a land-mower with you to mow all the weeds. Initially, you are standing with your lawnmower at the top-left corner of the garden. That is, at cell (1,1)(1,1) . At any moment of time you are facing a certain direction — either left or right. And initially, you face right.

In one move you can do either one of these:

1) Move one cell in the direction that you are facing.

  • if you are facing right: move from cell (r,c)(r,c) to cell (r,c+1)(r,c+1) 
  • if you are facing left: move from cell (r,c)(r,c) to cell (r,c-1)(r,c−1) 

    2) Move one cell down (that is, from cell (r,c)(r,c) to cell (r+1,c)(r+1,c) ), and change your direction to the opposite one.- if you were facing right previously, you will face left 

  • if you were facing left previously, you will face right 

You are not allowed to leave the garden. Weeds will be mowed if you and your lawnmower are standing at the cell containing the weeds (your direction doesn't matter). This action isn't counted as a move.

What is the minimum number of moves required to mow all the weeds?

输入输出格式

输入格式:

The first line contains two integers nn and mm ( 1<=n,m<=1501<=n,m<=150 ) — the number of rows and columns respectively. Then follow nn lines containing mm characters each — the content of the grid. "G" means that this cell contains grass. "W" means that this cell contains weeds.

It is guaranteed that the top-left corner of the grid will contain grass.

输出格式:

Print a single number — the minimum number of moves required to mow all the weeds.

输入输出样例

输入样例#1:

  1. 4 5
  2. GWGGW
  3. GGWGG
  4. GWGGG
  5. WGGGG
输出样例#1:

  1. 11
输入样例#2:

  1. 3 3
  2. GWW
  3. WWW
  4. WWG
输出样例#2:

  1. 7
输入样例#3:

  1. 1 1
  2. G
输出样例#3:

  1. 0

说明

For the first example, this is the picture of the initial state of the grid:

A possible solution is by mowing the weeds as illustrated below:

Solution:

  本题比较水,直接贪心模拟就好了。

  题意就是从$(1,1)$出发,最少需要多少步能除完草(即$W$),而每次移动的方向已经确定了,当$i$为奇数则第$i$行的方向为$1\rightarrow m$,否则为$m\rightarrow 1$,每次下移必须转变到所到行的方向上。

  只需要记录一下每一行中草的位置,然后按行的方向模拟找到两边界(要么是一行草的开头位置,要么是结尾位置,具体由该行的方向确定),然后直接算曼哈顿距离,求和就解决了。

代码:

  1. #include<bits/stdc++.h>
  2. #pragma GCC optimize(2)
  3. #define il inline
  4. #define ll long long
  5. #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
  6. #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
  7. using namespace std;
  8. const int N=,M=;
  9. int n,m,mp[N][N],cnt;
  10. char s;
  11. int main(){
  12. scanf("%d%d",&n,&m);
  13. For(i,,n) For(j,,m) {
  14. cin>>s;
  15. if(s=='W') mp[i][++mp[i][]]=j;
  16. }
  17. int ans=,lsx=,lsy=;
  18. For(i,,n) {
  19. if(i&) {
  20. if(mp[i][]){
  21. ans+=(abs(i-lsx)+abs(mp[i][]-lsy));
  22. ans+=(abs(mp[i][mp[i][]]-mp[i][]));
  23. lsx=i,lsy=mp[i][mp[i][]],cnt++;
  24. }
  25. }
  26. else {
  27. if(mp[i][]){
  28. ans+=(abs(i-lsx)+abs(mp[i][mp[i][]]-lsy));
  29. ans+=(abs(mp[i][mp[i][]]-mp[i][]));
  30. lsx=i,lsy=mp[i][],cnt++;
  31. }
  32. }
  33. }
  34. cout<<ans;
  35. return ;
  36. }

CF115B Lawnmower的更多相关文章

  1. CF115B Lawnmower(贪心)

    CF115B Lawnmower \(solution:\) 很明显的一道贪心题,奇数行只能向左走,偶数行只能向右走,每一行的起点应该在上一行就已确定,而这一行的终点只和(这一行最后一棵草(相对于你走 ...

  2. Lawnmower(洛谷 CF115B)

    题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...

  3. CF 115B Lawnmower(贪心)

    题目链接: 传送门 Lawnmower time limit per test:2 second     memory limit per test:256 megabytes Description ...

  4. zzd 的割草机(Lawnmower)

    评测传送门 [题目描述] 已知花坛为一个 n * m 的矩形,草只会长在某些个格子上,zzd 有一个割草机,一开始,zzd 站在(1,1)处,面向(1,m)(面向右).每次 zzd 有两个选择(耗费一 ...

  5. C# 语言规范_版本5.0 (第7章 表达式)

    1. 表达式 表达式是一个运算符和操作数的序列.本章定义语法.操作数和运算符的计算顺序以及表达式的含义. 1.1 表达式的分类 一个表达式可归类为下列类别之一: 值.每个值都有关联的类型. 变量.每个 ...

  6. C#6.0语言规范(七) 表达式

    表达式是运算符和操作数的序列.本章定义了操作数和运算符的语法,求值顺序以及表达式的含义. 表达式分类 表达式分类为以下之一: 一个值.每个值都有一个关联的类型. 一个变量.每个变量都有一个关联的类型, ...

  7. C# 各版本新特性

    C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection&l ...

  8. NCE3

    Lesson1  A puma at large Pumas are large, cat-like animals which are found in America. When reports ...

  9. CIFAR10/CIFAR100数据集介绍

    CIFAR-10/CIFAR-100数据集解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 CIFAR-10/CIFAR-100数据集 CIFAR-10和CIFAR-100被标记 ...

随机推荐

  1. css3新样式

    超出两行变省略号 overflow:hidden; text-overflow:ellipsis;display:-webkit-box; -webkit-box-orient:vertical;-w ...

  2. Lavavel5.5源代码 - Pipeline

    <?php class Pipeline { protected $passable; protected $pipes = []; protected $method = 'handle'; ...

  3. java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed

    错误描述: ElasticSearch集群启动错误,错误的原因是:因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致 ...

  4. Hadoop(25)-高可用集群配置,HDFS-HA和YARN-HA

    一. HA概述 1. 所谓HA(High Available),即高可用(7*24小时不中断服务). 2. 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA ...

  5. Static关键字,遇到的问题_1

    一.问题 父类代码:                                                                                          ...

  6. linux系统编程之框架

    linux系统编程之框架: 1. 进程 1.1 进程概念 1.1.1 PCB 1.1.2 环境变量 1.2 进程控制 1.3 进程间通信 1.3.1 管道 1.3.2 有名管道 1.3.3 共享内存 ...

  7. py3.7.1下pyinstaller 的安装及打包 坑

    实在无语了,写了个小程序,用pyinstaller打包,运行就出现这个pip install pywin32-ctypes.明明全部都已经安装了啊. 解决办法: 不要在工程设置里安装pyinstall ...

  8. while,格式化输出

    1. while循环: while 条件: 代码块(循环体) num=1 while num<=5: print(num) num+=1 break:结束循环;停止当前本层循环 continue ...

  9. ULINE(插入水平线)

    WRITE 'This is Underlined'. ULINE. 输出结果: This is Underlined. ———————————————————

  10. java 解析xml 多命名空间问题

    先贴段有命名空间的xml吧.. <feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3. ...