您的位置:首页 > 其它

zoj 2571 Big String Outspread

2011-01-05 22:41 288 查看
看输入输出就知道啥题了 = =。。。



第一反应是,类似等价表达式,无语啦都,第一反应想到用栈。感觉好繁。然后党说他代码只有50+,刺激~就自己想去了。



开始的想法是以左括号为限制,开始展开,记录,靠左边的左括号展开的时候需要用右边左括号的已经展开的字符串,越写感觉越迷茫。而且如果有两个括号并列,是不行的。YM。



党说用递归。刚开始也想了,只不过一直对递归很抵触,就没用 = =。后来没办法,用了。居然稀里糊涂差不多对了,改了几个小地方居然A了 = =。。。好伟大。。。嘻嘻。后来觉得,这个也不难呀,(*^__^*) 嘻嘻……



#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int LEN;
int x;
char str[260];
void output(int pos)
{
	int i,len;
	if( pos >= LEN )
		return;
	if( str[pos] == ')' )
	{
		x = pos;  //这个是解决并列括号的状况 
		return;
	}
	if( str[pos] == '(' )
	{
		output(pos+1);
		return;
	}
	if( isalpha(str[pos]) )
	{
		printf("%c",str[pos]);
		output(pos+1);
		return;
	}
	if( isdigit(str[pos]) )
	{
		len = str[pos] - '0';
		if( isalpha(str[pos+1]) )
		{
			for(i=0; i<len; i++)
				printf("%c",str[pos+1]);
			output(pos+2);
		}
		if( str[pos+1] == '(' )
		{
			for(i=0; i<len; i++)
				output(pos+1);
			output(x+1);// 因为如果不这么记录的话,并列的括号就会算在上个和它并列的左括号里 
		}
		return;
	}
}
int main()
{
	int ncases;
	scanf("%d",&ncases);
	getchar();
	while( ncases-- )
	{
		gets(str);
		LEN = strlen(str);
		output(0);
		printf("/n");
	}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: