题解 【P2027 bf】
0xff 前言
本题不难,模拟即可。
但是,要注意细节啊!!!
否则,上图便是结果。
0x00 题意
给你一个 BrainF**k 程序和输入,输出这段程序的输出。
0x01 思路
注:由于洛谷的 feature ,本文以 [dollar-sign] 代替 美元符号
由于这道题的输入比较复杂,考虑用指针来输入。
坑点 #
1 :
程序的结尾和 [dollar-sign] 之间没有空格,但输入的结尾和 [dollar-sign] 之间有空格!
就是这玩意儿坑了我
定义一个指针
然后一直读入,直到
然后,令
读入
然后就是模拟啦!
- < 内存指针左移一位
- > 内存指针右移一位
- + 内存指针的内容加一
- - 内存指针的内容减一。
对于 [ ,跳到与它匹配的 ] 。
注意,不是最近的 ] !
例:++[>++[-]<-] 。
那怎么匹配呢?
- 定义一个计数器 cnt,并初始化为
0 。 - 若遇到 左方括号,
cnt\gets cnt+1 。 - 若遇到 右方括号
- 若
cnt = 0 ,则这个右方括号就是于之前的左方括号匹配的那个。 - 否则,
cnt\gets cnt-1 。
- 若
- 就这样一直扫过去,直到发现匹配右方括号。
[ 与 ] 类似,在此不再详述。
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;
}