CYaRon!语
P3695 CYaRon!语
开始之前
上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟。
然后这个题花了我一个多星期
还是最差解
不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想写篇题解,记录我的一点一滴。
大致思路
模拟题,都是根据题意直接模拟的(雾。
这个题呢,就适合分步完成。
关于变量
用的变量大都是汉语拼音或者缩写或者半缩写(比较好调)。
有些地方没加注释就可以直接读拼音理解含义。
成长过程
一 . 输出,变量,赋值
刚开始我是这么想的:
先把变量、数组和赋值、输出打完。
-
输出
直接将表达式的值计算出来输出即可。
-
变量和数组
用到了两个 map,用来映射 string 和 int 或者 array 之间的关系。
-
赋值
和输出差不多,将变量名储存下来,计算出后边表达式的值即可。
具体看代码。
显然这个 js
是不对的,没有判断减法,:yosoro 2-1
都是错的。
数组的处理也有些错误。
得了 20 分。
但我当时没在意,就去打 ihu
了。
二 .ihu
我对 ihu
想的很简单,没考虑循环的情况。
如果 ihu
合法,就顺序执行;否则,就将更深层数的读入,跳过。
层数的定义大概就是每遇到一个 {
层数 +1,遇到 }
层数 -1。
然后又小改了一下 js
,完善了减法的维护。
事实证明,我的 ihu
思路上没什么大错误。
30 分。
三 . 数组
之后我看了数据那张图。
就这个:
“不对啊,应该是 50 吗?”
然后就开始调试数组。
我就发现 js
用递归的话,ls
是个全局变量,会被清空。
然后我就直接当数字计算了……
没考虑数组下标是变量的情况。
不过,50 分就这么到手了……
四 .hor
从这开始,就开始有些恶心了。
因为要重复操作,顺序操作可能不好弄,所以这里选择了递归。
用了一个 zhixing
函数,将更深层数的操作储存下来。用循环递归处理。
但是因为是一些奇奇怪怪的原因,main
函数中的 zhixing
是以读入的形式执行的,而递归时则是以储存的形式执行的。
所以要有一些判断,将读入或是储存的代码统一起来。
但这样只能执行单层循环,不能嵌套(不管是嵌套循环还是 ihu)。
而原因呢,就是因为如果循环之中嵌套循环,递归执行到下一次循环时,又会执行 getline
函数。
那么加一个判断条件,如果是第一次循环(严格来说是最外层循环),就将更深层次的存下来;否则就从之前储存的代码中找到要执行的语句。
关于 duiy
的用处,举一个简单的例子:
{ vars
a:int
b:int
}
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
}
不加 duiy
的输出:
1 2 0 1 2 0
加 duiy
的输出:
1 2 1 2
如果将循环执行的语句 顺序 输出的话,那么不加 duiy
的应该是这样的(仅 hor
循环):
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
}
也就是说,循环结束之后又顺序执行了一遍循环体。
应该……不难理解吧。
感性理解一下吧。
然后就 60 分了。
这里的 duiy
统计比较浅显,没有考虑 ihu
的不成立时跳过和 while
语句。
五 .while
ihu
和 hor
打完之后,while
就很好打了。
因为 while
完全就是 ihu
和 hor
的结合体。
顺便又修改了一下 js
函数。
修复了之前说的数组下标是变量时的错误。
还完善了对于循环中的 ihu
的跳过处理。
可以发现,这时的 zhixing
函数有了返回值。
这是为了判断 ihu
是否需要跳过。
而且此时的 duiy
函数的统计方式也变成了由大括号直接统计,而不是通过 hor
统计。
交上之后,80 分了,两个 TLE。
六 .set
通过下载数据,可以发现,#6 的 set
的变量和数值之间没有空格,这就导致了我的处理出现奇奇怪怪的错误(我的处理是按照空格划分的)。
既然这样,反正 set
中的 ,
是绝对有的,那么就根据这个 ,
划分变量。
七 . 数组
“你的 vector
怎么实现的?”
“就直接用啊。”
“那它如果直接是一个 9?”
“嗯?哦,我先 push_back
了 1000 个 0。”
“那你?”
“好像是哦。”
虽然这个对话有些奇怪,但我们两个都 get 到了对方的意思。
于是我就把 vector
换成了 int
数组。
其实差不多(反正都是最差解)。
总结
个人感觉这种紫色的大模拟对于代码能力的锻炼还是很有用的。
除了过程有点折磨外,A 掉之后还是很开心的。
如果对于我的代码疑问,可以私信问我。
2022 年 noip 后就要退役了。退役前还是能回复的。
大学之后可能会是不是上洛谷或博客园看看。
如果觉得这篇题解写的还可以,请不要吝啬您的点赞。