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;
    }
    
  • 相关阅读:
    新东方总裁俞敏洪—度过有意义的生命
    [导入]【翻译】WF从入门到精通(第九章):逻辑流活动
    [导入]【翻译】WF从入门到精通(第十一章):并行活动
    [导入]【翻译】WF从入门到精通(第五章):workflow跟踪
    收集的连接
    [导入]【翻译】WF从入门到精通(第二章):workflow运行时
    重温SQL——行转列,列转行 3333
    转载] 重新整理高手的win2003+asp+php+mysql+zend+phpmyadmin服务器环境
    [导入]【翻译】WF从入门到精通(第十二章):策略和规则
    (转)Windows 批处理实现 定时打开IE 延时一段时间后 关闭IE
  • 原文地址:https://www.cnblogs.com/llke/p/10800125.html
Copyright © 2011-2022 走看看