1068: zdw的编译器
时间限制: 1 Sec 内存限制: 128 MB提交: 28 解决: 10
[ 提交][ 状态][ 讨论版]
题目描述
zdw参照某种语言的灵感,自创了一种语言,名字叫:AK语言(因为他总能AK)
AK语言非常简单,只包含8个符号,以下是关于这种语言的介绍:
> 当前指针向右移动
< 当前指针向左移动
+ 指针指向的字节数值增加1
- 指针指向的字节数值减少1
? 等待用户输入字符存入当前指针指向的内存单元
: 输出当前指针指向的内存单元的值在ASCII码表中对应的符号
{ 如果内存所指向的内存单元存储的值为0,则跳转到对应的}符号的后一条语句,否则继续执行
} 如果内存所指向的内存单元存储的值不为0,则跳转到对应的{符号的后一条语句,否则继续执行
//想必大家也明白,{ }这两个符号总是成对出现。{ 会与哪个 }配对应该不用多解释了==
现在zdw有一个问题。给你一段AK程序,你能否输出这段程序会输出的结果?
输入数据:一行字符串,长度小于3000,表示一个完整的AK程序
如果所给的AK程序有要求输入的话,将会在输入文件第二行开始给出。
输出:这段AK程序会输出的结果
对于30%的数据,没有{和}这两种符号
对于另30%的数据,没有?符号
对于100%的数据,表示AK程序的字符串长度小于3000,该AK程序使用内存不超过1000个字节
数据保证不会访问负下标内存,程序开始时,指针指向地址为0的内存单元。且数据输入的程序使用内存不会超过1000个字节。
注意:如果不是选手故意,数据给定的AK程序不会运行太多步,也就是几乎不会超时。(除非交了个while(true)什么的)(或者说直接按照程序正常解释执行即可, 不需要加编译优化)
样例1:
INPUT
++++++++++{>+>+++>+++++++>++++++++++<<<<-}>>>++:>+:+++++++::+++:<<++:>+++++++++++++++:>:+++:------:--------:<<+:<:
OUTPUT
Hello World!
样例2:
INPUT
?>??>++++++{<-------->-}<{<+>-}<:
1 2
OUTPUT
3
//样例两个经典程序 Hello World 和 a+b
输入
输出
提示
来源
题意:输入包含 的八种字符的字符串,根据字符的定义,输出相应的结果,输出的字符,注意:+ - 为当前位置的 值加1减1;
这道题一定要注意括号配对;
给出一组数据
输入:
abcd
输出:
ABCD
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#include<map>
#define INF 0x3f3f3f3f
#define Max 3010
#define ll long long
char str[Max];
int a[Max];
int a1[Max],a2[Max]; // 当 str[j] 为括号时,a1,a2数组 存与它的对应的括号的位置;
int tt[Max];
void check(int l)
{
int i,j;
int sum = 0;
for(i = 0;i<l;i++)
{
if(str[i]=='{')
{
tt[sum++] = i;
}
else if(str[i]=='}')
{
a1[tt[sum-1]] = i;
a2[i] = tt[sum-1];
sum--;
}
}
}
int main()
{
int i,j;
char c;
while(~scanf("%s",str))
{
getchar();
int l = strlen(str);
check(l);
int red;
memset(a,0,sizeof(a));
int top = 0;
for(i = 0;i<l;i++)
{
if(str[i]=='+')
a[top]++;
else if(str[i]=='-')
a[top]--;
else if(str[i]=='{')
{
if(a[top]== 0)
{
i = a1[i];
}
else red = i;
}
else if(str[i]=='}')
{
if(a[top]!=0)
i = a2[i];
else
continue;
}
else if(str[i]=='>')
top++;
else if(str[i]=='<')
top--;
else if(str[i]=='?')
{
scanf("%c",&c);
a[top] = c;
}
else if(str[i]==':')
{
printf("%c",a[top]);
}
}
//printf("\n");
}
return 0;
}