题解 P1322 【logo语言】
P1322 【logo语言】
我写了两种方法,一种递归,一种模拟。交了10次A了2次(三次90,一次80)????????
递归(绝对纯递归):
#include<bits/stdc++.h>
using namespace std;
int dg()
{
string s;
char c;
int k,l=0,v;
while (cin>>c)//回车+^z自动结束输入.
{
if (c==']') break;//特判像"REPEAT 1[] BK 1"这样的情况,不然只有90.
cin>>s>>k;
if (c=='R')
{
v=getchar();//读'['.
l+=k*dg();
v=getchar();//读']'后' '.
}
if (c=='B') v=getchar(),l-=k;
if (c=='F') v=getchar(),l+=k;
if (v==int(']')) break;//如果v==int(' ')就一直读
}
return l;//这里就不必多说了
}
int main()
{
cout<<abs(dg());//巨短主函数
return 0;
}
是不是巨短???才0.42kb!!!
模拟(绝对纯模拟,不含一丁点递归和栈):
#include<bits/stdc++.h>
using namespace std;
struct logo
{
int v;
char c;
int d;
int i;
}a[150];
bool cmp(logo a,logo b)
{
if (a.d!=b.d) return a.d>b.d;
else return a.c>b.c;//巧用字典排序
}
int main()
{
int n,m,j,k=0,l=0,i=0,o=1,p=0,w=0;
char c,v;
string s;
while (cin>>c)
{
if (isupper(c))
{
i++;
cin>>s>>a[i].v;
a[i].c=c;a[i].d=k;//a[i].c存命令等级,a[i].d存运算等级(过于抽象,只可意会不可言传)
}
if (c=='[') {k++;l=0;}//等级++
if (c==']')
{
k--;
sort(a+o,a+o+i,cmp);//repeat语句内的命令按运算等级和命令等级
for (j=o;j<=i;j++)
{
if (a[j].c=='R') l=l*a[j].v;//计算repeat语句内部
if (a[j].c=='F') l=l+a[j].v;//同上
if (a[j].c=='B') l=l-a[j].v;//同上
}
o=j;//下一次执行命令的起始位置
if (k==0) p=p+l;
}
if (v=='['&&c==']') w=1;//特判像"REPEAT 1[] BK 1"这样的情况,不然只有90.
v=c;
}
if (o==1||w==1)//如果没有repeat语句的情况
{
sort(a+o,a+o+i,cmp);
for (j=o;j<=i;j++)
{
if (a[j].c=='R') l=l*a[j].v;
if (a[j].c=='F') l=l+a[j].v;
if (a[j].c=='B') l=l-a[j].v;
}
p=p+l;
}
cout<<abs(p)<<endl;
return 0;
}
模拟是不是巨长???1.13kb!!!
模拟很容易被hack,欢迎大佬hack
敬请大佬指出错误
P.S.可以看看我坎坷的AC道路