首页 > 试题广场 >

迷路的牛牛

[编程题]迷路的牛牛
  • 热度指数:293 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。
接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。


输出描述:
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。
示例1

输入

3
LRR

输出

E

模拟

构造个转向映射就行
1)朝向为北时,往左会让朝向变西,往右会让朝向变东
2)朝向为南时,往左会让朝向变东,往右会让朝向变西
3)朝向为西时,往左会让朝向变南,往右会让朝向变北
4)朝向为东时,往左会让朝向变北,往右会让朝向变南
n = int(input())
path = input().strip()
m = {"N": {"L": "W", "R": "E"}, 
     "S": {"L": "E", "R": "W"}, 
     "W": {"L": "S", "R": "N"}, 
     "E": {"L": "N", "R": "S"}}
direction = "N"
for c in path:
    direction = m[direction][c]
print(direction)

发表于 2022-03-18 09:45:57 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();
        String dir = in.next();

        int result = 0;
        char[] chars = dir.toCharArray();
        for (char c: chars){
            if (c == 'L') result += 1;
            else if (c == 'R') result += 3;
        }

        switch (result % 4){
            case 0: System.out.println("N");break;
            case 1: System.out.println("W");break;
            case 2: System.out.println("S");break;
            case 3: System.out.println("E");break;
        }
    }
}

向左转加1,向右转加3
发表于 2020-03-25 12:30:24 回复(0)
忘记有负数的情况了
发表于 2022-09-11 14:25:46 回复(0)
N = input()
turns = input()

direction = sum([1-2*(turn == "L") for turn in turns])%4

if direction == 0: print("N")
if direction == 1: print("E")
if direction == 2: print("S")
if direction == 3: print("W")
答案就要看着简单
发表于 2021-03-16 22:35:45 回复(0)
import sys
num_a = input()
str_a = sys.stdin.readline().strip()
dir_lr = ['N','E','S','W']
dir_ll = ['N','W','S','E']
num_l = str_a.count('L')
num_r = str_a.count('R')
if num_l <= num_r:
    res_r = num_r - num_l
    print(dir_lr[res_r % 4])
else:
    res_l = num_l - num_r
    print(dir_ll[res_l % 4])

发表于 2020-08-28 23:23:36 回复(0)
  • 主要是找规律,一对L和R可以抵消一次方向变化

  • 找出字符串中L和R的个数关系,然后换算出方向

  • 注意算个数关系时记得对4取余(%4)

    #include <iostream>
    (720)#include <algorithm>
    using namespace std;
    int main()
    {
      int num, numL, numR;
      int answer;  // 保存L和R的个数关系,再换算出方向
      string s;
      cin >> num;
      cin >> s;
      numL = count(s.begin(), s.end(),'L');  // 计算字符串中L的个数
      numR = count(s.begin(), s.end(),'R');
      if(numL > numR){
          answer = (numL -numR)%4;
          switch(answer){
              case 1:cout<<'W'<<endl;break;
              case 2:cout<<'S'<<endl;break;
              case 3:cout<<'E'<<endl;break;
              case 0:cout<<'N'<<endl;break;
          }
    
      }
      else{
          answer = (numR - numL)%4;
          switch(answer){
              case 1:cout<<'E';break;
              case 2:cout<<'S';break;
              case 3:cout<<'W';break;
              case 0:cout<<'N';break;
          }
      }
    
      return 0;
    }
    

```

发表于 2020-03-17 17:03:22 回复(0)
把状态变换全部列出来就可以了
#include<iostream>
(720)#include<cstring>
#include<string>
(765)#include<algorithm>
using namespace std;
int main(){
    int N;
    cin>>N;
    char s[N];
    for(int i=0;i<N;i++) cin>>s[i];
    char cur = 'N';
    for(int i=0;i<N;i++){
        if((cur=='E' && s[i]=='L') || (cur=='W' && s[i]=='R')) cur = 'N';
        else if((cur=='E' && s[i]=='R') || (cur=='W' && s[i]=='L')) cur = 'S';
        else if((cur=='N' && s[i]=='R') || (cur=='S' && s[i]=='L')) cur = 'E';
        else if((cur=='N' && s[i]=='L') || (cur=='S' && s[i]=='R')) cur = 'W';       
    }
    cout<<cur<<endl;
}

发表于 2020-03-15 21:32:57 回复(0)