题目描述

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:

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

11
输入样例#2:

3 3
GWW
WWW
WWG
输出样例#2:

7
输入样例#3:

1 1
G
输出样例#3:

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$,每次下移必须转变到所到行的方向上。

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

代码:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=,M=;
int n,m,mp[N][N],cnt;
char s;
int main(){
scanf("%d%d",&n,&m);
For(i,,n) For(j,,m) {
cin>>s;
if(s=='W') mp[i][++mp[i][]]=j;
}
int ans=,lsx=,lsy=;
For(i,,n) {
if(i&) {
if(mp[i][]){
ans+=(abs(i-lsx)+abs(mp[i][]-lsy));
ans+=(abs(mp[i][mp[i][]]-mp[i][]));
lsx=i,lsy=mp[i][mp[i][]],cnt++;
}
}
else {
if(mp[i][]){
ans+=(abs(i-lsx)+abs(mp[i][mp[i][]]-lsy));
ans+=(abs(mp[i][mp[i][]]-mp[i][]));
lsx=i,lsy=mp[i][],cnt++;
}
}
}
cout<<ans;
return ;
}

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. Java中replace与replaceAll区别

    看门见山 1.java中replace API: replace(char oldChar, char newChar):寓意为:返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所 ...

  2. Linux 用户 和 组 快速了解

    1用户 (Linux中“只有超级管理员”才有权限操作 用户 和组) 1.1添加用户 useradd 命令 例如 :useradd hly //添加了一个新账户 hly 用户添加后 会存放在一个文件中, ...

  3. ThinkPHP之__construct()和__initialize()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

  4. 吐血分享:QQ群霸屏技术(初级篇)

    QQ群,仿似一个冷宫;But,你真摒弃不起. 某人,坐拥2000多个2000人群,月收入10w+,此类人数少,皆因多年的沉淀,以形成完全的壁垒,难以企及的层次. 流量的分散,QQ群相对比较优质的地带, ...

  5. 深入理解is_callable和method_exists

    一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...

  6. CacheManager源码分析

    计算rdd的某个分区是从RDD的iterator()方法开始的,我们从这个方法进入 然后我们进入getOrCompute()方法中看看是如何进行读取数据或计算的 getOrElseUpdate()方方 ...

  7. centOS下更新yum源

    CentOS下更新yum源 1.使用如下命令,备份/etc/yum.repos.d/CentOS-Base.repo. cp /etc/yum.repos.d/CentOS-Base.repo /et ...

  8. Python的scrapy之爬取妹子图片

    闲来无事,做的一个小爬虫项目 爬虫主程序: import scrapy from ..items import MeiziItem class MztSpider(scrapy.Spider): na ...

  9. 列表排序之NB三人组附加一个希尔排序

    NB三人组之 快速排序 def partition(li, left, right): tmp = li[left] while left < right: while left < ri ...

  10. app:showAsAction 和android:showAsAction

    app:showAsAction 它有三个可选项1.always:总是显示在界面上2.never:不显示在界面上,只让出现在右边的三个点中3.ifRoom:如果有位置才显示,不然就出现在右边的三个点中 ...