题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1498
解题思路:
模拟brainfuck的运行过程,其实这种模拟题都有个明确的流程:分析输入串(包括分析词法、判断出错等)、运行输入串。注意下题目给出的规则就行了。这题还是很简单的。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
char c[128001];
int jump[128001];
int top;
char tmp[128001];
char a[32768];
stack<int>q;
void work(){
memset(a,0,sizeof(a));
memset(jump,0,sizeof(jump));
while(!q.empty())q.pop();
for(int i=0;i<top;i++){
if(c[i]=='['){
q.push(i);
}else if(c[i]==']'){
if(q.empty()){
printf("COMPILE ERROR\n");
return;
}
int t=q.top();
q.pop();
jump[i]=t;
jump[t]=i;
}
}
if(!q.empty()){
printf("COMPILE ERROR\n");
return;
}
int p=0;
//for(int i=0;i<top;i++)printf("%c",c[i]);
for(int i=0;i<top;i++){
//printf("%d\n",a[p]);
if(c[i]=='>')p=(p+1+32768)%32768;
else if(c[i]=='<')p=(p-1+32768)%32768;
else if(c[i]=='+')a[p]=(a[p]+1+255)%255;
else if(c[i]=='-')a[p]=(a[p]-1+255)%255;
else if(c[i]=='.')printf("%c",a[p]);
else if(c[i]=='['){
if(a[p]==0){i=jump[i];
//printf("jump %d\n",i);
}
}else if(c[i]==']'){
if(a[p]!=0){i=jump[i];
//printf("jump %d\n",i);
}
}
}
printf("\n");
}
int main(){
int T;
scanf("%d",&T);
getchar();
int ca=1;
while(T--){
printf("PROGRAM #%d:\n",ca++);
top=0;
while(1){
gets(tmp);
if(strcmp(tmp,"end")==0){
work();
break;
}
int len=strlen(tmp);
for(int i=0;i<len;i++){
if(tmp[i]=='%')break;
if(tmp[i]=='<'||tmp[i]=='>'||tmp[i]=='+'||tmp[i]=='-'||tmp[i]=='.'||tmp[i]=='['||tmp[i]==']'){
c[top++]=tmp[i];
}
}
}
}
}