题解 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道路