1 条题解
-
0
自动搬运
来自洛谷,原作者为

fjy666
请将我幻葬搬运于
2025-08-24 21:33:06,当前版本为作者最后更新于2021-03-12 13:24:58,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
0xff 前言
本题不难,模拟即可。
但是,要注意细节啊!!!
否则,上图便是结果。
0x00 题意
给你一个 BrainF**k 程序和输入,输出这段程序的输出。
0x01 思路
注:由于洛谷的 feature ,本文以 [dollar-sign] 代替 美元符号
由于这道题的输入比较复杂,考虑用指针来输入。
坑点 #:
程序的结尾和 [dollar-sign] 之间没有空格,但输入的结尾和 [dollar-sign] 之间有空格!就是这玩意儿坑了我 多次提交
定义一个指针 ,指向输入数组的开头。
然后一直读入,直到 。
然后,令 即可。读入 类似,不过要注意:最后还要令 !
然后就是模拟啦!
- < 内存指针左移一位
- > 内存指针右移一位
- + 内存指针的内容加一
- - 内存指针的内容减一。
对于 [ ,跳到与它匹配的 ] 。
注意,不是最近的 ] !
例:++[>++[-]<-]。
那怎么匹配呢?- 定义一个计数器 cnt,并初始化为 。
- 若遇到 左方括号, 。
- 若遇到 右方括号
- 若 ,则这个右方括号就是于之前的左方括号匹配的那个。
- 否则,。
- 就这样一直扫过去,直到发现匹配右方括号。
[ 与 ] 类似,在此不再详述。
0x02 代码
#include <cstdio> #define fo(i_,j_,k_) for(int i_=j_;i_<=k_;++i_) #define fr(i_,j_,k_) for(int i_=j_;i_>=k_;--i_) #define It(type_) type_::iterator #define rg register #define rtn return #define il inline typedef long long ll; char memory[30005],*ptr; char cmd[300005],input_[300005],*curr,*input; int main() { curr = cmd; while((*curr = getchar()) && *curr != '$') ++curr; *curr = 0; getchar(); input = input_; while((*input = getchar())&& *input != '$') ++input; *input = 0; *(input-1) = 0; curr = cmd; input = input_; ptr = memory; // printf("%s,%s.\n",cmd,input); while(*curr != '\0') { switch(*curr) { case '<': -- ptr;break; case '>': ++ ptr;break; case '+': ++ *ptr; break; case '-': -- *ptr; break; case '.': putchar(*ptr);break; case ',': *ptr = (*input == '\0')? -1 : *input; if(*input != '\0') ++input; break; case '[': if(*ptr == 0) { ++curr; int cnt = 0; while(!(*curr == ']' && cnt == 0)) { if(*curr == '[') ++cnt; if(*curr == ']') --cnt; ++curr; } } break; case ']': --curr; int cnt = 0; while(!(cnt == 0 && *curr == '[')) { if(*curr == ']') ++ cnt; if(*curr == '[') -- cnt; --curr; } --curr; break; } ++curr; } rtn 0; }
- 1
信息
- ID
- 992
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者