热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

火车入轨_算法

【问题描述】某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转

【问题描述】

  某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A→C和C→B。

 

这个问题和之前数据结构实验的火车入轨类似,而且较之简化。自己尝试写了下,和书上参考答案的代码量仍有较大差距。代码如下:

 1 #include
 2 using namespace std;
 3 const int MAXSIZE=100;
 4 void main()
 5 {
 6     int n;
 7     cin>>n;
 8     int a[MAXSIZE],b[MAXSIZE];
 9     int stack[MAXSIZE];
10     for(int i=0;i)
11     {
12         a[i]=i+1;
13         cin>>b[i];                      //出栈顺序
14     }
15     int top=-1;
16     int count=0;
17     int i=0;
18     for(;;)
19     {
20         if(i<n)
21         {
22             ++top;
23             stack[top]=a[i++];            //入栈
24             cout<<"PUSH"<<endl;
25         }
26     
27         if(stack[top]==b[count])
28         {
29             top--;count++;
30             cout<<"POP"<<endl;
31         }
32         else if(i==n)
33         {
34             cout<<"NO"<<endl;
35             break;
36         }
37         if(count==n)
38         {
39             cout<<"YES"<<endl;
40             break;
41         }
42         if(top<-1)
43         {    
44             cout<<"NO"<<endl;
45             break;
46         }
47     }
48 
49 }

 书中参考代码如下:

 1 #include
 2 using namespace std;
 3 const int MAXN=1000+10;
 4 int n,target[MAXN];
 5 void main()
 6 {
 7     while(cin>>n)
 8     {
 9         int stack[MAXN],top=0;
10         int A=1,B=1;                                              //A用来记录入栈次数,B用来记录出轨的火车序号
11         for(int i=1;i<=n;i++)
12             cin>>target[i];                                        //记录出轨顺序
13         int ok=1;
14         while(B<=n)
15         {
16             if(A==target[B]){A++;B++;}
17             else if(top && stack[top]==target[B]){top--;B++;}      //出栈
18             else if((A<=n)) stack[++top]=A++;                      //入栈
19             else {ok=0;break;}
20         }
21         if(ok)
22             cout<<"Yes"<<endl;
23         else
24             cout<<"No"<<endl;
25     }

同样,可以用STL来实现,只需对书中参考答案作微小改动,代码如下:

 1 /*STL栈来实现*/
 2 #include
 3 #include
 4 using namespace std;
 5 const int MAXN=1000+10;
 6 int n,target[MAXN];
 7 int main()
 8 {
 9     while(cin>>n)
10     {
11         stack<int> s;
12         int A=1,B=1;
13         for(int i=1;i<=n;i++)
14             cin>>target[i];
15         int ok=1;
16         while(B<=n)
17         {
18             if(A==target[B]){A++;B++;}
19             else if(!s.empty() && s.top()==target[B]){s.pop();B++;}
20             else if(A<=n) s.push(A++);
21             else {ok=0;break;}
22         }
23         if(ok)
24             cout<<"YES"<<endl;
25         else
26             cout<<"NO"<<endl;
27     }
28 }

【总结】

  自己写的代码仍有优化的空间。学习参考答案的清晰逻辑的表达。学习STL栈的使用。

  联系数据结构实验中关于火车入轨的提升,对缓冲轨的限制,应该增加一个判断即可。


推荐阅读
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
戊辰冬月半
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有