迷路的牛牛(模拟,环状模拟)

题目描述
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。

输入
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。
接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。
输出
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。

样例输入
3
LRR

样例输出
E

题目分析:
这个题目可以直接按照题目意思模拟一遍,也可以把它当做环去处理(这是一种很高级的用法),首先我们先放简单模拟的代码,代码需要注意的地方:如果用的是if …else if …else if …else那么程序只会执行其中一条语句,如果用的是if…if…if…else…那么程序只要满足if语句的条件语句就会执行。

贴上我愚蠢的做法~

#include 
using namespace std;
char c[1010];
int main()
{
    int n;
    while (~scanf("%d", &n))
    {
        char x = 'N';
        scanf("%s", c + 1);
        int lc = strlen(c + 1);
        for (int i = 1; i <= lc; ++i)
        {
            if (x == 'N' && c[i] == 'L')
                x = 'W';
            else if (x == 'N' && c[i] == 'R')
                x = 'E';
            else if (x == 'S' && c[i] == 'L')
                x = 'E';
            else if (x == 'S' && c[i] == 'R')
                x = 'W';
            else if (x == 'W' && c[i] == 'L')
                x = 'S';
            else if (x == 'W' && c[i] == 'R')
                x = 'N';
            else if (x == 'E' && c[i] == 'L')
                x = 'N';
            else if (x == 'E' && c[i] == 'R')
                x = 'S';
        }
        printf("%c\n", x);
    }
    return 0;
}

此处贴上大佬高级的做法(模拟环状处理),因为牛牛只会往两种方向转变,要不是左边,要不是右边,此刻我们把东南西北做成一个环,只要往右走那么当前的值就加一,往左走当前的值就减一,最后为了避免出现负数的情况,我们可以先加一个比较大的4的倍数之后再去做取余处理。

  • 在环上位置的改变问题可以通过求模(取余)进行模拟计算
  • 向右看成+1,向左看成-1,初始为0
  • 最后避免对负数取模加一个4000

这是大佬极其牛逼的代码,此刻的牛逼已经不能表达我对大佬的敬意~ Or2

#include 
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
char s[maxn];
char dir[4] = {'N', 'E', 'S', 'W'};
int main()
{
    int n, now = 0;
    scanf("%d %s", &n, s + 1);
    for (int i = 1; i <= n; ++i)
    {
        if (s[i] == 'R')
            ++now;
        else
            --now;
    }
    printf("%c\n", dir[(now + 4000) % 4]);
    return 0;
}
心无旁骛,专心于事业的追求,就会忘掉很多烦恼,找到许多努力过程中的快乐,默默耕耘的人其实是最有智慧的人——黑格尔

你可能感兴趣的:(模拟)