• 洛谷 P2027 bf


    题目描述

    bf是一种编程语言,全称为BrainFuck,因为题目名称不能太露骨,所以就简写成bf了。

    这种语言的运行机制十分简单,只有一个大小为30000的有符号8位整数(范围[-128,127])的内存槽,和一个指向内存槽中位置的指针,在最初的时候指向内存槽的第一个整数。

    这种语言的字符集也是十分的简单,只有+-,.><[]。

    字符|意义
    <  |指针所指向的内存地址减一。
    >  |指针所指向的内存地址加一。
    +  |指针所指向的内存里面的数值加一。
    -  |指针所指向的内存里面的数值减一。
    .  |输出当前指针所指向的内存里面的数值(以字符形式输出)。
    ,  |将读入缓冲区中的一个字节送入当前指针指向的内存里面。如果读入缓冲区为空则送入-1。
    [  |当前指针指向的内存里面的数值不为0时,重复执行与之相匹配的]之间的语句,直到回到[时当前指针指向的内存中的数值为0。
    ]  |如上。

    输入输出格式

    输入格式:

     

    输入数据若干行,代码有注释。直到一个$为代码截止。

    $后面紧跟一个空格(不属于输入缓冲区),空格后面是输入缓冲区里面的内容,以一个空格和一个$截止。

     

    输出格式:

     

    输出这段代码的执行结果。

     

    输入输出样例

    输入样例#1: 复制
    write whatever u c ,.,.,.,. $ asdf $
    输出样例#1: 复制
    asdf

    说明

    【数据范围】

    对于10%的数据,没有循环。

    对于另外10%的数据,循环没有嵌套。

    对于100%的数据,输入的程序不会访问越界,输入的程序能够在10^6步内运行结束,|输入的字符串|<=30000。 字符在内存中的数值为字符所对应的Ascii码。

    思路:模拟。

    但是太麻烦了,所以就去copy了一下大佬的思路。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    char codes[30001];
    char inputs[30001];
    signed char data[30000]={0};
    int down[30001],up[30001],tstack[15000];
    char t;
    signed char * pdata;
    int main(){
        int i=0,j=0,k=0,ncodes,ninputs; //i记录codes的索引,j记录inputs的索引,k记录tstack的索引
        while((t=getchar())!='$')
            if(strchr("><.,+-[]",t))
                codes[i++]=t;
        ncodes=i; //为代码的总字符数
        codes[ncodes]='';
        getchar();//跳过'$'后的空格
        while((t=getchar())!='$')    inputs[j++]=t;
        ninputs=j-1;
        inputs[ninputs]='';
        //读入完成,开始预处理
        for(i=0;i<ncodes;i++){
            switch(codes[i]){
                case '[': tstack[k++]=i; break;
                case ']': down[tstack[--k]]=i; up[i]=tstack[k]; break;
            }
        }
        //预处理完成,开始解释
        i=0,j=0,pdata=data; //索引、数据指针归零
        while(i<ncodes){//遍历代码
            switch(codes[i]){
                case '<': pdata--; break;
                case '>': pdata++; break;
                case '.': putchar(*pdata); break;
                case ',': if(j<ninputs) *pdata=inputs[j++];
                          else *pdata=-1;//此时已读完输入缓冲,置为-1
                          break;
                case '+': (*pdata)++; break;
                case '-': (*pdata)--; break;
                case '[': if(!(*pdata)) i=down[i]; break;
                case ']': if(*pdata) i=up[i]; break;
            }
            i++;
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    Android开源项目收藏
    ubuntu修改ip获取方式(静态,动态)
    linux内核调用用户空间程序
    linux 改变目录下所有文件及其子文件夹下的权限
    jquery remove() empty()
    jquery之attr()和removeAttr() prop的使用场所
    jquery 获取对象的八种总结
    html子标签浮动父标签无法扩充
    静态代码块
    java static介绍
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8150207.html
Copyright © 2020-2023  润新知