CYaRon!语

P3695 CYaRon!语

开始之前

上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟。

然后这个题花了我一个多星期

还是最差解

不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想写篇题解,记录我的一点一滴。

大致思路

模拟题,都是根据题意直接模拟的(雾。

这个题呢,就适合分步完成。

关于变量

用的变量大都是汉语拼音或者缩写或者半缩写(比较好调)。

有些地方没加注释就可以直接读拼音理解含义。

成长过程

一 . 输出,变量,赋值

刚开始我是这么想的:

先把变量、数组和赋值、输出打完。

  1. 输出

    直接将表达式的值计算出来输出即可。

  2. 变量和数组

    用到了两个 map,用来映射 string 和 int 或者 array 之间的关系。

  3. 赋值

    和输出差不多,将变量名储存下来,计算出后边表达式的值即可。

具体看代码

显然这个 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

ihuhor 打完之后,while 就很好打了。

因为 while 完全就是 ihuhor 的结合体。

顺便又修改了一下 js 函数。

修复了之前说的数组下标是变量时的错误。

还完善了对于循环中的 ihu 的跳过处理。

代码

可以发现,这时的 zhixing 函数有了返回值。

这是为了判断 ihu 是否需要跳过。

而且此时的 duiy 函数的统计方式也变成了由大括号直接统计,而不是通过 hor 统计。

交上之后,80 分了,两个 TLE。

六 .set

通过下载数据,可以发现,#6 的 set 的变量和数值之间没有空格,这就导致了我的处理出现奇奇怪怪的错误(我的处理是按照空格划分的)。

既然这样,反正 set 中的 , 是绝对有的,那么就根据这个 , 划分变量。

AC Code

七 . 数组

“你的 vector 怎么实现的?”

“就直接用啊。”

“那它如果直接是一个 9?”

“嗯?哦,我先 push_back 了 1000 个 0。”

“那你?”

“好像是哦。”

虽然这个对话有些奇怪,但我们两个都 get 到了对方的意思。

于是我就把 vector 换成了 int 数组。

其实差不多(反正都是最差解)。

AC Code

含调试过程的代码

总结

个人感觉这种紫色的大模拟对于代码能力的锻炼还是很有用的。

除了过程有点折磨外,A 掉之后还是很开心的。

如果对于我的代码疑问,可以私信问我。

2022 年 noip 后就要退役了。退役前还是能回复的。

大学之后可能会是不是上洛谷或博客园看看。

如果觉得这篇题解写的还可以,请不要吝啬您的点赞。

广告

博客园

posted @ 2022-06-16 11:15  Zvelig1205  阅读(135)  评论(0编辑  收藏  举报