【ACM】杭电1022:Train Problem I


分析:

明显是一个栈的问题。利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决。

我的思路是:

用2个字符数组保存火车车厢的序列。首先比较出站后(记为s2)数组和出站前 (记为s1)数组的第一个元素,会有以下3种情况:

1、元素相等,则说明这节车厢可以进站后马上出站,直接输出in,out,不需要执行真正的压栈操作。(当然你想压再出一下也行。。不过那是没有任何意义的)

2、元素不相同时,检查栈顶元素是否与s2相同,如果不同,则把s1当前元素压入栈中,输出in,并将s1的字符指针后移一位。

3、元素不相同时,检查栈顶元素是否与s2相同,如果相同,则执行出栈操作,输出out.

如果 s1已经全部压入栈中,而s2后面还有元素没有被比较过,则说明无法按照指定的序列重组火车,输出No


代码:(我写得有点复杂了,其实没这么麻烦的。。不要误导大家了,大家只看上面的思路分析就行 。。)

#include <stdio.h>
#include <string.h>
typedef struct /* »ð³µ¸÷½Ú³µÏáµÄÐòºÅ */
{
	char ID[15];
	int top;
}TRAIN;
typedef struct /* 为什么是乱码 */
{
	char ch[10];
}RESULT;
void to_str(int num,char *res,int len)/* °ÑÊäÈëµÄÕûÊýת»¯Îª×Ö·û´® */
{
	int ix;
	for(ix = len - 1 ; ix >= 0 ; --ix)
	{
		res[ix] = num % 10 + 48; 
		num /= 10; 
	}
}
int get_digit(int num)/* µÃµ½ÕûÊýµÄλÊý */
{
	int res = 0;
	while(num)
	{
		++res;
		num /= 10;
	}
	return res;
}
int main(int argc, char *argv[])
{
	TRAIN tn;
	RESULT res[20];
	
	tn.top = 0;
	char t1[10],t2[10];
	int len,before,after,len1,len2,i,j,len_res;
	while(scanf("%d%d%d",&len,&before,&after) != EOF)
	{
		/* ³õʹ»¯ */
		len1 = get_digit(before);
		len2 = get_digit(after);
		memset(t1,0,sizeof(t1));
		memset(t2,0,sizeof(t2));
		to_str(before,t1,len1);
		to_str(after,t2,len2);
		len_res = 0;
		memset(res,0,sizeof(res));
		memset(&tn,0,sizeof(TRAIN));
		
		for(i = 0,j = 0 ; i <= len2 ; ++i)
		{
			if(j > len2 - 1 && i > len2 - 1)  /* ³É¹¦ */
			{
				strcpy(res[len_res++].ch,"Yes.");/* ÒòΪҪÏÈÅжÏÄÜ·ñ³É¹¦£¬ËùÒÔÒª°ÑÖмä¹ý³ÌµÄ½ø³öÐÅÏ¢±£´æÆðÀ´ */
				break;
			}
			if(t2[i] != '\0' && j > len2 - 1 && t2[i] != tn.ID[tn.top])  /* ʧ°Ü */
			{
				strcpy(res[len_res++].ch,"NO.");
				tn.top = 0; 
				break;
			}
			
			
			if(t2[i] != t1[j] && tn.ID[tn.top] != t2[i] && t2[i] != '\0')
			{
				tn.ID[++tn.top] = t1[j];
				++j;
				--i;
				strcpy(res[len_res++].ch,"in");
			}
			else if(t2[i] != t1[j] && tn.ID[tn.top] == t2[i])
			{
				tn.top--;
				strcpy(res[len_res++].ch,"out");
			}
			else if(t2[i] == t1[j]) /* ÈëվǰºÍÈëÕ¾ºó¶ÔÓ¦µÄ³µÏáºÅÏàµÈ£¬ÔòÏȽø£¬ÔÙÂíÉϳö */
			{
				++j;
				strcpy(res[len_res++].ch,"in");
				strcpy(res[len_res++].ch,"out");
			}
		}
		
		if(!strcmp(res[len_res - 1].ch,"Yes."))
		{
			printf("Yes.\n");
			for(i = 0 ; i < len_res - 1; ++i)
				printf("%s\n",res[i].ch);
			printf("FINISH\n");
		}
		else
			printf("No.\nFINISH\n");
			
	}
	
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值