sdnuoj 1052.水题3(恶心的机器人)

Description

lg是妹子,这是大家众所周知的
但是lg有个恶趣味估计没人知道
好吧既然没有人知道就算了的吧
lg有的机器人,机器人能按照遥控器的指令来进行运动
具体的指令如下:
H&*^kf30pq 机器人走一步
f03u5klfj# 机器人走两步
lsuf9823ur 机器人走三步
skhf9832ht 机器人走四步
jdsifu9w8e 机器人退回起点
%^Ihdfskjf 机器人启动自爆倒计时
# %^% ^cxk 机器人结束自爆倒计时
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲%^#tids 机器人发动自爆
98dfgoier# 机器人随机跑到某个角落
当机器人启动自爆倒计时的时候,在执行了10条其他非结束或发动自爆指令之后会自动爆炸
如果发动自爆的话直接自爆,如果机器人接收到随机跑到某个角落的指令,则会找不到其位置所在
现在遥控器在syc手里,lg想将其机器人收回,但是他只有syc的指令集,所以请你判断一下机器人能否找回来

Input

相关的指令

Output

如果lg能确切知道机器人走了多少步,且机器人没有自爆,那么是可以找回来的,输出Y,否则输出N

Sample Input

sdnuoj 1052.水题3(恶心的机器人)_第1张图片

Sample Output

Y

题意:给你相关的指令,判断能否在没爆炸的情况下且知道具体步数的情况下找到机器人

坑点:指令太多,眼花缭乱,而且如果直接判断很长的字符串就会超时(有两种方法,一个就是用map,另一个就是我接下来用的字符串首字母,能大大减少比较字符串的时间)。还有就是跑丢的问题,得仔细分析。再就是判断的时候用的变量比较多,比较杂,得好好区分

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long ll;

const int M = (int)1e7;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;
//map 用法如下
//mp  tr;
//
//tr["H"] = 1;//走一步
//tr["f03u5klfj#"] = 2;//走两步
//tr["lsuf9823ur"] = 3;//走三步
//tr["skhf9832ht"] = 4;//走四步
//tr["jdsifu9w8e"] = 0;//回到起点
//tr["%^Ihdfskjf"] = 5;//开始
//tr["#$%^%$^cxk"] = 6;//结束
//tr["$#%^#$tids"] = 7;//爆炸
//tr["98dfgoier#"] = 8;//跑了

int zou = 0;//看看开始走了没有
int num = 0;//计算一下有没有到十个指令
int ans = 0;//如果num满10 ,则赋1,或者爆了也赋1,
int pao = 0;//看看跑丢了没,跑了就赋0,回到起点就赋1

int main()
{
    string s, ss;
    while(cin>>s)
    {
        if(s[0] == 'H' || s[0] == 'f' || s[0] == 'l' || s[0] == 's')//判断首字母
        {
            if(zou)//如果之前开始走了,则zou = 1,所以可以进行这个语句,让num++
                num++;

        }
        else if(s[0] == 'j')//回到起点
        {

            pao = 0;//这个赋0是因为可能出现先跑丢,然后又跑回原点的情况,这个时候就能收回
            if(zou)
                num++;

        }
        else if(s[0] == '%')//开始
        {
            zou = 1;
        }
        else if(s[0] == '#')//终止爆炸
        {
           // k = 1;//终止爆炸,如果没跑丢,这个东西我本来想单独开一个是否爆炸,和不爆炸的,后来发现可以和ans合在一起,就省了
            zou = 0;
            num = 0;
        }
        else if(s[0] == '$')//爆炸
        {
            ans = 1;
        }
        else if(s[0] == '9')
        {
            pao = 1;
        }
        if(num == 10)
        {
            ans = 1;
        }
    }
        if(ans == 1 || pao == 1)
        {
            cout<<"N"<<endl;
        }
        else if(ans == 0 && pao == 0)
        {
            cout<<"Y"<<endl;
        }

        return 0;
}














还有一个坑点,就是这个样例它不够十个,你运行的时候要换行然后摁Ctrl+z,再运行

你可能感兴趣的:(sdnuoj 1052.水题3(恶心的机器人))