P1322 logo语言

代码

#include<bits/stdc++.h>
using namespace std;
char logo[300];
int len=0;
int s=0;
void read(){//注1 
	int c=getchar();
	while((c>='A'&&c<='Z')||c==' '||(c>='0'&&c<='9')||c=='['||c==']'){
		logo[len]=c;
		len++;
		c=getchar();
	}
}
int number(int x,int y){//注2 
	int t=0;
	while(x<=y){
		t=(t<<3)+(t<<1)+logo[x]-'0';
		x++;
	}
	return t;
}
void FD(int x,int y){
	int t=number(x,y);
	s=s+t;
}
void BK(int x,int y){
	int t=number(x,y);
	s=s-t;
}
void find(int x,int y){
	for(int i=x;i<y;){//注3(1) 
		if(logo[i]=='F'){
			int u=-1;
			for(int j=i+3;j<y;j++){
				if(logo[j]==' '){
					u=j;
					break;
				}
			}
			if(u==-1){
				FD(i+3,y-1);
				i=len;
			} 
			else{
				FD(i+3,u-1);
				i=u+1;
			}
		}
		else if(logo[i]=='B'){
			int u=-1;
			for(int j=i+3;j<y;j++){
				if(logo[j]==' '){
					u=j;
					break;
				}
			}
			if(u==-1){
				BK(i+3,y-1);
				i=len;
			}
			else{
				BK(i+3,u-1);
				i=u+1;
			}
		}
		else if(logo[i]=='R'){
			int u;
			for(int j=i+7;j<len;j++){
				if(logo[j]=='['){
					u=j;
					break;
				}
			}
			int _x=i+7;
			int _y=u-1;
			int q=1;
			i=u;
			while(q!=0){
				i++;
				if(logo[i]=='[') q++;
				else if(logo[i]==']') q--;
			}
			int _l=u+1;
			int _r=i;//注3(2) 
			int ti=number(_x,_y);
			for(int k=1;k<=ti;k++){
				find(_l,_r);//注3(3) 	
			}
			i++;
		}
		else{//注4 
			i++;
		}
	}
}
int main(){
	read();
	find(0,len);
	cout<<abs(s);
}

思路

思路并不是很难,即读入字符串,遍历,找到关键字(FD,BK,REPEAT),再把中间一段代码扔到递归里去,难点在于需要不断地调试和亿点点一点点细节的处理。

一些注意点

注1

因为scanf和string+cin读不了空格,所以用的是getchar(又快,len还能表示长度,nice

注2

简单的数字转换对吧。

注3

注意这里是左闭右开

注4

一定要加!!!
不然过不了某些不太正常的数据(有时候有空格,有时候没有(鬼知道什么玩意儿))

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值