P1322 logo语言

用递归,题目见:logo语言 - 洛谷

#include <stdio.h>
char s[100000];
int dfs(char *p)//前进和后退很简单
{
	//char *p=s;
	int n=0;
	while(*p!='\0')
	{
		if(*p=='F')
		{
			while(*p>'9'||*p<'0')
				p++;
			int m=0;
			while(*p>='0'&&*p<='9')
			{
				int key=*p-'0';
				m=m*10+key;
				p++;
			}
			n+=m;
		}
		else if(*p=='B')
		{
			while(*p>'9'||*p<'0')
				p++;
			int m=0;
			while(*p>='0'&&*p<='9')
			{
				int key=*p-'0';
				m=m*10+key;
				p++;
			}
			n-=m;
		}
		else if(*p=='R')//重复,即将子段临时构建成以\0为结尾的合法字符串
		{
			while(*p>'9'||*p<'0')
				p++;
			int m=0;
			while(*p>='0'&&*p<='9')
			{
				int key=*p-'0';
				m=m*10+key;
				p++;
			}
			int i=0;
			char *q=p;
			while(*p!='\0')
			{
				if(*p=='[')
					i++;
				else if(*p==']')
					i--;
				if(i==0)
				{
					*p='\0';//找到该重复的末尾,将其修改成\0
					break;
				}
				p++;
			}
			n=n+m*dfs(q);//进入子段计算
			*p=']';//恢复
		}
		else 
			p++;
	}
	return n>0? n: -n;
}
int main()
{
	int i=0;
	char c;
	while(1)//洛谷getchar读入,末尾为EOF
	{
		c=getchar();
		if(c==EOF)
			break;
		s[i++]=c;
	}
	s[i]='\0';
	int n=dfs(s);递归开始
	printf("%d",n);
	return 0;
}

版权声明:本文为weixin_62677028原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。