#CPP11. 【Level 1】auto

【Level 1】auto

auto 关键字

  现代 C++ 通常是指 C++ 11 及之后的 C++ 版本,因为其对于 C++ 语法进行了大幅度的更新,引入了方便的特性,本文要介绍的 auto 关键字的特性就是其中之一。本文不讨论 autoconst& 结合所产生的复杂化学反应,如果有兴趣请自行了解。

  定义变量的方式是 类型 变量名,而如果你使用 auto 则编译器会自动推导变量的类型,如下所示,x 将会被自动推导为 int 类型。

auto x = 5;

  我们前面已经知道,引用是在类型的位置加一个 &,但编译器目前还不够智能,不能自动推断你是否要使用引用,因此你需要手动加上,如下所示

auto x = 5;
auto &r = x;

简化代码

案例1

  auto 关键字对于我们目前最大作用是简化代码,例如我们要取一个 vector 首个元素的迭代器(我们将在 STL 部分解释迭代器的作用),需要用对应 vector 类型的迭代器来接受,这样的写法较为麻烦,如下所示

vector<int> vec;

vector<int>::iterator itr;
itr = vec.begin();

  这时我们就可以使用 auto 来省去类型

vector<int> vec;

auto itr = vec.begin();

案例2

  在前面讲解数组时,我们已经知道可以用 auto 简化 vector 的遍历,让我们回顾一下

vector<int> nums;

for (auto x : nums) {
    // do something ...
}

  我们可以根据实际需求决定是否使用引用或者 const。如果我们想要修改 nums 的内容,就必须声明为引用,如下所示

for (auto &x : nums) {
    // do something ...
}

  有时候我们会看到 const& 一起出现,既然要修改才加引用,但为什么又要加 const 使其不能修改呢?这是因为这里的引用起到的作用是减少拷贝,如果只是要读取 vector 内的元素,你都可以这样做。

for (const auto &x : nums) {
    // do something ...
}

案例3

  在介绍引用时提到的一个简化 vector 的例子,我们将其简化为

vector<int> &ax = a[i - 2*j +1];

  不难发现,可以使用 auto 来进一步简化

auto &ax = a[i - 2*j + 1];

Description

  在一次星际旅行中,飞船正在探索一个 n x m 的二维星域矩阵,每个位置表示一个星球的资源储量。飞船从某个星球出发,经过多个星球,根据指令进行移动后采集资源。如果移动指令非法(超出边界),则忽略这条移动指令,在原地再采集一次。

  资源采集规则:

  1. 飞船经过的星球 (i, j) 本身资源会减少 2 个单位
  2. 对于该星球相邻的 3x3 区域内的其它星球,按照以下规则进行资源变化:
  • 如果相邻星球的资源储量大于当前星球的资源储量,增加 1 个单位
  • 如果相邻星球的资源储量小于等于当前星球的资源储量,减少 1 个单位
  1. 资源最多只能减少到 0
  2. 先移动,后采集资源

Format

Input

  第一行两个整数 nnmm,表示星域矩阵的行数和列数。

  接下来 nn 行,每行包含 mm 个整数,表示每个星球的资源储量。

  接下来一行两个整数 x y (0x<n)(0y<m)x\ y\ (0 \leq x < n) (0 \leq y < m),表示飞船的起始位置。

  接下来一行一个整数 tt,表示飞船的运动步数。

  接下来 tt 行,每行表示飞船的一个移动方向,方向由字符 U(上)、D(下)、L(左)、R(右)中的一个表示。

Output

  输出一个 n x m 的矩阵,表示经过资源采集操作后的资源储量矩阵。

Samples

3 3
5 5 5
5 5 5
5 5 5
2 2
4
U
L
D
R
6 7 7 
7 2 0 
7 4 6 
3 3
5 5 5
5 5 5
5 5 5
0 0
4
U
L
D
R
0 9 4
4 6 4
3 3 4