博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ACM】杭电1022:Train Problem I
阅读量:6326 次
发布时间:2019-06-22

本文共 2307 字,大约阅读时间需要 7 分钟。

分析:

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

我的思路是:

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

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

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

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

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

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

#include 
#include
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;}

转载于:https://www.cnblogs.com/whongfei/archive/2012/10/28/5247026.html

你可能感兴趣的文章
简明 Python 编程规范
查看>>
linux-0.11内核 调试教程+GCC源代码
查看>>
IDEA快捷键大全
查看>>
在XML里的XSD和DTD以及standalone的使用3----具体使用详解
查看>>
《微信小程序七日谈》- 第四天:页面路径最多五层?导航可以这么玩
查看>>
linux用户密码生成
查看>>
Python图像处理(11):k均值
查看>>
注解总结
查看>>
微信公众号特异功能列表
查看>>
36.Node.js 工具模块--OS模块系统操作
查看>>
Python之cv2
查看>>
函数的泛型约束是函数签名的一部分,不符合约束的初始调用将不能查找到函数(报错)...
查看>>
《Android学习指南》分享给大家
查看>>
WayOs 各个版本:包括完美破解版、内置重启版、内置免拉黑、OEM
查看>>
浏览器内核及渲染过程介绍
查看>>
clear .svn folder use bat
查看>>
c++ 类 总结
查看>>
java日期转字符串 字符串转日期 日期转日历 日历转日期
查看>>
hdu 2413(最大匹配+二分)
查看>>
ASP.NET Cookie概念、CURD操作、原理、实际运用
查看>>