zoukankan      html  css  js  c++  java
  • upc组队赛6 GlitchBot【枚举】

    GlitchBot

    题目描述

    One of our delivery robots is malfunctioning! The job of the robot is simple; it should follow a list of instructions in order to reach a target destination. The list of instructions is originally correct to get the robot to the target. However, something is going wrong as we upload the instructions into the robot’s memory. During the upload, one random instruction from the list takes on a different value than intended. Yes,there is always a single bad instruction in the robot’s memory and it always results in the robot arriving at an incorrect destination as it finishes executing the list of instructions.
    The robot can execute the instructions “Left”, “Right”, and “Forward”. The “Left” and “Right” instructions do not result in spatial movement but result in a 90-degree turn in the corresponding direction. “Forward” is the only instruction that results in spatial movement, causing the robot to move one unit in the direction it is facing. The robot always starts at the origin (0, 0) of a grid and faces north along the positive y-axis.
    Given the coordinates of the target destination and the list of instructions that the robot has in its memory, you are to identify a correction to the instructions to help the robot reach the proper destination.

    输入

    The first line of the input contains the x and y integer coordinates of the target destination, where −50 ≤ x ≤ 50 and −50 ≤ y ≤ 50. The following line contains an integer n representing the number of instructions in the list, where 1 ≤ n ≤ 50. The remaining n lines each contain a single instruction. These instructions may be: “Left”, “Forward”, or “Right”.

    输出

    Identify how to correct the robot’s instructions by printing the line number (starting at 1) of an incorrect input instruction, followed by an instruction substitution that would make the robot reach the target destination. If there are multiple ways to fix the instructions, report the fix that occurs for the earliest line number in the sequence of instructions. There is always exactly one unique earliest fix.

    样例输入

    3 2
    11
    Forward
    Right
    Forward
    Forward
    Left
    Forward
    Forward
    Left
    Forward
    Right
    Forward
    

    样例输出

    8 Right
    

    题意

    有个机器人 Forward 向前走 Left向左转向 Right向右转向

    从(0,0)走到(xx,yy) n步操作,有一步操作是错的,要把他修改成其他操作到达(xx,yy)

    题解

    枚举每一个操作,将其改成其他两种操作,看能不能到达终点

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define pb push_back
    #define mp make_pair
    #define rep(i,a,n) for(int i=a;i<n;++i)
    #define readc(x) scanf("%c",&x)
    #define read(x) scanf("%d",&x)
    #define sca(x) scanf("%d",&x)
    #define sca2(x,y) scanf("%d%d",&x,&y)
    #define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define print(x) printf("%d
    ",x)
    #define mst(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) x&-x
    #define lson(x) x<<1
    #define rson(x) x<<1|1
    #define pb push_back
    #define mp make_pair
    typedef long long ll;
    typedef pair<int,int> P;
    const int INF =0x3f3f3f3f;
    const int inf =0x3f3f3f3f;
    const int mod = 1e9+7;
    const int MAXN = 105;
    const int maxn =1000010;
    using namespace std;
    int xx,yy;
    int m;
    string s[55];
    string f[3] = {"Forward","Left","Right"};
    int dir[4][2] = {0,1,-1,0,0,-1,1,0}; //0上1左2下3右 left
    int x = 0,y = 0;
    
    bool solve(string s[]){
      x = y = 0;
      int ori = 0;
      for(int i = 0 ;i < m; i++){
        if(s[i] == f[0]){
          x += dir[ori][0];
          y += dir[ori][1];
        }
        else if(s[i] == f[1])
            ori = (ori + 1) % 4;
        else
          ori = (ori + 4 - 1) % 4;
      }
       return xx == x && yy == y;
    }
    int main(){
      ios::sync_with_stdio(false);
      cin >> xx >> yy >> m;
      for(int i = 0; i < m; i++) 
        cin >> s[i];
      for(int i = 0; i < m; i++){
        string tmp = s[i];
        for(int j = 0; j < 3; j++){
          if(s[i] == f[j]){
            for(int k = 0; k < 3; k++){
                if(j == k) continue;
                s[i] = f[k];
                if(solve(s)){
                  cout << i + 1 << " " << s[i]<< endl;
                  return 0;
                }
                s[i] = tmp;
            }
          }
        }
      }
      return 0;
    }
    
  • 相关阅读:
    第四十一篇-android studio 关闭自动保存功能
    《深入理解mybatis原理》 Mybatis初始化机制详解
    Java多线程系列--“基础篇”10之 线程优先级和守护线程
    Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
    Java多线程系列--“基础篇”08之 join()
    Java多线程系列--“基础篇”07之 线程休眠
    Java多线程系列--“基础篇”06之 线程让步
    Java多线程系列--“基础篇”05之 线程等待与唤醒
    【深入Java虚拟机】之八:Java垃圾收集机制
    【深入Java虚拟机】之七:Javac编译与JIT编译
  • 原文地址:https://www.cnblogs.com/llke/p/10800125.html
Copyright © 2011-2022 走看看