zoukankan      html  css  js  c++  java
  • 北京爱酷T恤部落B2C电子商务网站改版 案例分析

    北京工业大学软件学院

    工程硕士研究生案例分析报告

     

     

     

    题 目 北京爱酷T恤部落B2C电子商务网站改版

    学 号 G200618075

    2008年3月3日

     

    北京工业大学软件学院

    1.案例类型    - 1 -

    2.案例背景    - 1 -

    3.案例内容    - 1 -

    4.案例中的焦点问题    - 1 -

    4.1软件成本估算    - 1 -

    4.2可行性研究    - 2 -

    4.3风险管理    - 3 -

    5.案例涉及到的开发技术和管理技术    - 3 -

    5.1RAD开发方法学    - 3 -

    5.2软件配置管理    - 4 -

    5.3异地协同开发    - 5 -

    5.4 进度规划管理    - 7 -

    6.案例项目能够成功的基础    - 7 -

    6.1前期工作准备较充分    - 7 -

    6.2选择了恰当的开发工具、开发技术及开发平台    - 8 -

    7.案例项目可能失败的因素    - 9 -

    7.1使用新技术带来的不可预知的风险    - 9 -

    7.2未深层挖掘客户的需求以及后期引入新需求带来的风险    - 9 -

    8.案例项目中各种解决方案的内容和比较    - 9 -

    8.1.net平台下快速开发框架的选择    - 9 -

    9.案例结果分析与点评    - 13 -

    1.案例类型

    网络应用

    2.案例背景

        客户(以下简称甲方)希望创建一个基于WEB2.0模式的B2C电子商务网站,用以开展网上直销个性化T恤的工作。该网站目标客户是追求个性的时尚青年群体。甲方首先找到北京某外包公司(以下简称乙方)负责该网站的开发工作,经过一个多月的开发乙方为甲方制作出网站的雏形,之后甲方提出了众多改进意见和要求,乙方又经过两个多月的开发但仍未能满足甲方的要求,甲方希望乙方继续改进完善网站的功能和界面,而乙方认为已经履行了合同规定中的所有功能,不愿再作额外的改动,双方均不愿做出让步,导致网站开发工作陷入僵局。乙方又迫切希望网站能够尽快上线,因此乙方希望另外寻找一个开发团队接手这个项目进行网站的二期开发工作。

    3.案例内容

    从乙方接手(以下简称丙方)北京爱酷T恤部落B2C电子商务网站(www.iiqoo.com)已完成的一期工程,并在一期的基础上,根据客户提出的需求对网站进行改版以及功能模块的加强和扩充工作,并使网站能够按期上线。

    4.案例中的焦点问题

    4.1软件成本估算

    甲方在简单说明要求后,就希望丙方能够给出一个网站开发的大致费用,给丙方造成了困扰。和甲方进行多次沟通后,甲方同意待丙方了解了程序一期完成的情况及罗列出详尽的需求后再行商议开发费用。事实证明,这样做法是正确的,贸然给甲方报价不仅损害了甲方的利益也是对已方的不负责任,为了给丙方一个合理的报价,丙方开展了如下具体的工作。

    4.1.1掌握项目一期工程的细节

    从乙方接手该项目,除了提供的程序源码外,没有任何相关的技术文档,给丙方开展后序的工作增加了难度。丙方花费了大量的时间及精力在研读对方的程序架构、编程思路、程序实现到了何种程度、程序中的问题及缺陷等问题,并分模块对问题做了记录,以便为程序功能的加强及扩充做准备。

    4.1.2需求分析

    甲方提供了一份需求说明文档,罗列了需要改进和扩充的功能点。在对网站一期实现的功能有了一个比较全面的了解后,丙方对甲方罗列的功能点逐一与甲方进行了沟通,以明确需求。

    4.1.3工作量估算

        丙方采用了自顶向下逐步求精的方法来计算程序开发的工作量。根据甲方罗列的功能点,丙方对各个功能点进行详细的分解,细化到控件级别,根据以往的经验量化开发的工作量,并根据功能点的难易程度安排开发的先后顺序,并使用Miccrosoft Project 2003对工作量进行进度上的管理,如图1所示。

    图1

    4.2可行性研究

        甲方要求必须在年前(2008年2月7日)交付项目的二期工程,从和甲方接触(2007年12月22日)到最后交付不过40天时间,能否保质保量地完成甲方提出的任务,是摆在丙方面前的一大难题。通过全面精细的需求分析、工作量估算、进度规划,丙方认为在现有资源配比条件下能保质保量地完成工程,因此丙方承接该项目的二期工程。

    4.3风险管理

        考虑到项目的周期短、任务重,而家在外地的开发人员需要提前回家过年,因此考虑在项目中期根据项目进度执行情况确定是否增加开发人员的配比。

    5.案例涉及到的开发技术和管理技术

    5.1RAD开发方法学

    5.1.1敏捷开发

        要想快速、高效地开发项目,离不开方法论的指导。尤其是在时间紧、任务重的环境下,在项目开发的过程中有方法论的指导,可以使项目中的成员少走弯路,事半功倍。

        敏捷一词有轻便、机敏、迅捷、灵活、活力、高效等含义。2001年,17位软件开发方法学家齐聚一堂,将各自的开发方法进行了汇总,并共同定义了术语敏捷(Agile)。会议最终定制了敏捷软件开发宣言(Manifesto for Agile Software Development),并确立了一系列敏捷开发方法的价值观念和实用原则。敏捷开发方法汇集了众多的开发方法,其中包括极限编程XP、自适应软件开发ASD、水晶方法族Crystal Methods、动态系统开发方法DSDM、特征驱动的开发FDD以及SCRUM方法等等。

        敏捷软件开发(agile software development methods,ASDM)不是一个具体的过程,而是一个涵盖性术语。ASDM用于概括具有类似基础的软件开发方式和方法,敏捷开发团队及其成员必须具备下列特点:基本的软件相关技能;对所选敏捷过程的全局知识;共同目标;精诚合作;对不确定问题的决断能力;相互信任和尊重;自我组织能力。为了支持软件开发团体实施敏捷开发方法,敏捷联盟提出了"四个价值观"和"十二个指导原则"。

    ASDM方法的四个价值观如下:

    1.人及其相互作用要比过程和工具更值得关注。

    2.可运行的软件要比无所不及的各类文档更值得关注。

    3.与客户合作要比合同更值得关注。

    4.响应比按计划行事更值得关注。

    ASDM方法的指导原则如下:

    1.在快速不断地交付用户可运行软件的过程中,将用户的满意放在第一位。

    2.以积极的态度对待需求的变化,不管该变化出现在开发早期还是后期。敏捷过程紧密围绕变化展开,并利用变化来实现客户的竞争优势。

    3.以几周到几个月为周期,尽快地、不断地交付可运行的软件供用户使用。

    4.在项目过程中,业务人员和开发人员最好能一起工作。

    5.以积极向上的员工为中心建立项目组,给予他们所需的环境和支持,对他们的工作予以充分的信任。

    6.在项目组中,最有用、最有效的信息沟通手段是面对面的交谈。

    7.项目进度度量的首要依据是可运行的软件。

    8.敏捷过程调度重视可持续开发。项目发起者、开发者和用户应始终保持步调一致。

    9.应时刻关注技术上的精益求精和设计上的合理,这样才能提高软件的快速应变能力。

    10.尽可能减少不必要的工作,实现简单化。

    11.最好的框架结构、需求和设计产生于有自我组织能力的项目组。

    12.项目组要定期对其敏捷过程进行反思,提出改进意见,并进行相应的调整。

    此外,敏捷方法实施中一般采用面向对象的技术或其他接口定义良好的开发技术。另外它还强调在开发中要有足够的工具,如配置管理工具、建模工具等的支持。

    在项目开发过程中我们吸收敏捷开发中的部分易学易用的方法结合传统软件工程的方法学,取得了一定的实效。

    5.1.2利用控件技术提高程序的复用性

        在程序的设计阶段就考虑程序的复用性,将一些需要在多处应用的功能做成控件,使之只要实现一次即可。

    5.1.3使用统一的编码规范、风格,做好注释工作。

        使用统一的编码规范可以使程序清晰,便于维护,并方便后序人员做二次开发。

    5.2软件配置管理

        随着软件项目规模的日益增大,项目的复杂性不断增大,开发时间的紧迫性以及多平台开发环境的采用,使得软件开发面临越来越多的问题,其中包括对当前多种产品的开发和维护、保证产品版本的精确性、重建先前发布的产品、加强开发政策的统一性和对特殊版本需求的处理等等,解决这些问题的有效途径是加强管理,而软件开发管理的核心是软件配置管理。

        软件配置是由在软件工程过程中产生的所有信息项构成的,它可以看作该软件的具体形态(软件配置项)在某一时刻的影像。软件配置管理,简称SCM(Software Configuration Management),它有多种定义,在Wayne Baich的《SCM Coordinatin for Team Productivity》一文中,对软件配置管理进行了定义:"协调软件开发使得混乱减到最小的技术叫做软件配置管理,它是一种标识、组织和控制修改的技术,目的是使错误达到最小并最有效地提高生产效率。"

        软件配置管理贯串整个软件生命周期并应用于整个软件工程过程。在软件建立时变更是不可避免的,而变更加剧了项目中软件开发者之间的混乱。SCM活动的目标就是使标识变更、控制变更、确保变更正确实现并向其他有关人员报告变更。

    原始的开发工作是从早期的手工作坊式的个人软件开发的基础上发展的,无法适应现代大型项目的开发。手工开发的局限性体现在:独立开发、手工控制共享内容、原始的备份方式和无序的开发流程等。

        软件配置管理的目标是标识变更、控制变更、确保变更和报告变更。它要完成以下几个任务:标识、版本管理、变更控制、配置审计和配置报告。

        针对软件开发中的诸多问题,用人工的方法管理软件开发已不能满足需求,因此很多优秀的软件配置管理工具应运而生,使用这些工具我们能够轻松有效地管理我们的软件项目。这些常用的工具有Rational ClearCase、CCC/Harvest、Merant PVCS、Microsoft Visual SourceSave(简称VSS)、CVS等。使用这些工具的人员一般涉及开发人员、版本控制人员和项目经理等。以上这些工具各有不同的特点,分别适用于不同规模的软件开发项目。Rational公司推出的软件配置管理工具ClearCase主要用于Windows和Unix开发环境,它提供了全面的配置管理功能——包括版本控制、工作空间管理、建立管理和过程控制;Microsoft Visual SourceSafe具有简单易用、方便高效、与Windows操作系统及微软开发工具调度集成等优点;CVS,全称为Concurrent Versions System,即并行版本系统,它也是目前一种主流的软件配置管理工具,其服务器版本支持Linux,Sun Solaris,VMS等系统平台。

        丙方在项目中使用Visual SourceSafe 2005做为项目的版本控制工具,如图2所示。

    5.3异地协同开发

        丙方使用VSS进行多人之间的协同开发工作,但由于甲方将界面部分外包给异地的美工人员负责,且负责界面设计的美工人员由于自身的原因,未能及时提供全部的界面,因此丙方与美工协商由丙方定期(每3天)发布一个版本,美工人员在发布的服务器上对界面进行改进,待美工完成界面风格样式的改进后再通知丙方,丙方再利用文件及文件夹比对工具Beyond Compare(如图3所示)获取美工改动的文件,再利用文件比对工具Compare It!(如图4所示)将变动的地方融入到项目的最新版本中。

    图2

    图3

    图4

    5.4 进度规划管理

        项目管理是为了完成一个预定的目标,而对任务和资源进行计划、组织和管理的过程,通常需要满足时间、资源或成本方面的限制。要在项目实施过程中管理好一个项目,就要建立一套行之有效的项目控制系统,就要用到网络计划技术,就要处理大量的数据。实际上,项目经理完全靠人工管理一个项目通常会遇到很大的麻烦,微软推出的Microsoft Project 2003是一种强大的项目管理软件,应用它就能够系统地、迅速地收集数据,进行分析处理,可以直观地、量化地了解项目的实施情况,以便及时作出调整。

        在项目中,丙方使了Microsoft Project进行进度的规划管理工作,如图1所示。

    6.案例项目能够成功的基础

    6.1前期工作准备较充分

        丙方在确定承接该项目前,做了大量的先期调研工作,首先是对项目一期的程序进行了系统全面的分析,并在此基础上结合甲方提出的需求,逐一对各个需求点进行了沟通,确保准确无误地理解客户的意图;其次对开发工作量的估算细化到控件级别,确保能如期完成项目;然后对项目进行中可能遇到的问题进行了风险识别、风险监控,并适时根据项目进度增加开发人员,以确保项目的顺利实施

    6.2选择了恰当的开发工具、开发技术及开发平台

        使用了Visual Studio 2005+SqlServer 2005快速开发工具(如图5、图6所示),加快了开发和部署的速度;同时采用SunSonic,能够根据数据库结构的变化快速生成数据访问层的代码;使用版本控制工具VSS使团队成员能协同开发;使用文件及文件夹比较工具Beyond Compare和Compare It!对美工更改后的样式文件进行比对工作,并将所做的修改及时地融入到最新的程序代码中去。

    图5

    图6

    6.3定期迭代发布小版本,及时获取客户反馈,降低风险

        每个星期发布一个小版本,将已完成的功能模块展示给客户,并及时听取客户的反馈,避免出现大的偏差,根据客户的反馈做出及时的修正,用户提出的反馈意见往往会带来新的需求,对于这类需求,丙方首先会考虑该需求的可行性,若需求合理则将该需求放在最后或者适当的时机予以实现,以避免影响原有的项目开发进度,同时对于一些会打乱原来架构设计的需求,及时有效地和甲方进行沟通,提出折衷的方案,以获得甲方的谅解,避免项目验收时出现与甲方期望相距甚远的情况。

    7.案例项目可能失败的因素

    7.1使用新技术带来的不可预知的风险

        在项目中为了能加快项目的开发速度,尝试使用SubSonic作为项目的数据访问层,由于目前国内介绍使用该技术的相关文档非常少,一旦出现一些不可预知的问题将会延滞整个项目的开发。

    7.2未深层挖掘客户的需求以及后期引入新需求带来的风险

        在程序的开发过程中,丙方每星期会迭代发布一个新的版本,让甲方了解项目的进展并对丙方的程序给出修改意见,但此时客户往往会夹带提出一些新的需求,其中的一部分新需求是全新的,而另一部分虽然在客户的需求列表中没有给出,但是丙方的需求分析人员若能够从客户的角度出发,是可以发掘这些潜在需求的。在开发过程中再由甲方提出这些需求,无疑加大了程序开发的难度,同时也给项目进度的控制带来了困难,给程序的按时交付带来了很大的压力。这部分深层次客户需求挖掘工作的改进与提高是丙方今后需要努力的要点。

    8.案例项目中各种解决方案的内容和比较

    8.1.net平台下快速开发框架的选择

        由于项目的时间紧、任务重,选择一个适合团队自身状况的快速开发框架,将为项目的顺利开发提供强有力的支持。

    .net平台下快速开发框架如今已经像java一样百花争艳,目前在国内比较流行的有以下几种开发框架:

    1.Enterprise Library

    企业库是微软公司企业库模式与最佳实践的一个实版本。它包含了很多应用程序块。它是一系列帮助开发人员解决一般企业开发所遇到的问题的可重用可拓展组件集合。目前最新的版本是4.0,最新加入了IoC容器。

    2.Castle

    Castle是.Net系统级框架,它是将一些成熟开源应用进行无缝整合而成的一套完善的应用系统框架,这其中包括了ActiveRecord、DynamicProxy、MonoRail及MicroKernel/Windsor。MicroKernel/Windsor是Castle的底层核心实现,它采用IoC容器对系统进行运行期动态设置,主要包括Facilities、Components、Services三大部分。

    ActiveRecord对当前热门的ORM框架NHibernate进行了封装处理,主要包括将一些常用的数据进行抽象化、通过Attribute来取代mapping文件等。在ActiveRecord的实现中,Model对象必须继承Active-RecordBase对象以便于Castle容器的控制,限制Model对象从其他非持久化对象继承的可能,这是有违NHibernate/Hibernate最初的设计思想的。在Hibernate的设计思想中,Model对象可以是任意的Java Bean对象。MonoRail是Ruby on Rail的.Net实现,这是一个MVC Web框架。它与传统WebForm在控制上的不同之处在于WebForm采用页控制器模式,而MVC采用前端控制器模式。在界面表达方式上MonoRail采用模板引擎输出,模板引擎在PHP和JSP上已广泛使用,而在ASP.NET上因为服务端控件的强大功能和易用性而很少有人使用,两者各有优缺点。

    3.Spring.NET

    Spring.NET是由Spring框架移植而来的,Spring框架是Java著名的应用系统框架,它已成为替代轻量级企业应用的开发标准框架了。Spring.NET包括——Spring.Core core:就是一个对象工厂(ObjectFactory),它通过配置中的对象定义来创建对象,它的目的是消除对象的new操作。在配置文件中,除了定义对象的一些属性外,还能定义对象之间的相互关系,这就使得对象之间的耦合延迟到了运行时。如果针对接口或抽象类进行编程,则还可以通过具体对象的不同实现来定制系统的行为。

    Spring.AOP:这是按AOP联盟的接口定义来实现的,AOP即面向截面编程,其核心是通过给对象创建一个动态代理对象来接管对象的操作,这样就能对操作进行前置和后置处理了。

    Spring.Data:这是一个由第三方实现的整合到Spring内的数据访问组件,目前已包括了NHibernate的实现部分。

    Spring.NET还显得不够成熟,一些功能因为平台的局限性而导致了移植上的困难,与Castle相比差了一些。

    4.Nhibernate

    Nhibernate是.NET持久层框架,它由Java上的Hibernate移植而来。作为一种o/r mapping框架,它具有以下一些特点:完善的数据映射及关联操作;可扩展的持久机制;强大的数据加载功能;面向对象的数据查询语言HQL;缓存机制;多数据库支持。

    Nhibernate的强大之处在于开发者几乎不用去了解任何数据存储和查询的细节问题,而能更专注地通过面向对象设计来构建系统。其HQL查询语言完全是针对对象及其属性来设计的,与SQL语法保持一致,降低了学习的曲线。

    当然,Nhibernate还有一些不足之处,如报表数据。另外在性能上, Nhibernate通过反射来实现数据行到对象之间的转换以及一些操作, 都会造成性能上的一些损失。

    5.iBatis.NET

    作为另一种.Net持久层框架,iBatis.NET同样是由Java上的iBatis移植而来的o/r mapping框架,它包括DataMapping和DataAccess两部分——

    DataMapping:ORM的实现部分,对象映射通过映射文件来定义,支持one-to-one、one-to-many等对象关系映射。与Nhibernate显著不同的是,ibatis.net不会自动生成SQL语句,它通过预先定义好的SQL映射来执行数据操作,对于想自由操作SQL或使用复杂表达式的人来说,这是个不错的选择。

    DataAccess:数据存取框架实现,通过在配置文件中定义DAO接口及其实现,就可以方便使用DaoManager进行数据操作了,这也是一个在运行时决定具体实现的标准应用。

    6.NBear

    NBear是一个基于.Net2.0,由国人领导的开放源码的软件开发框架类库。NBear的设计目标是尽最大努力减少开发人员的工作量,最大地提高开发效率,同时兼顾性能及可伸缩性。Bear的核心包括一个泛型的、强类型的数据持久化接口、一组接口式的Entity定义组件、高性能 XML/JSON序列化支持、服务工厂、分布式服务队列和Web组件,因此:

    1. NBear最适合开发各类基于ASP.NET 2.0,对性能要求较高的Web程序。JSON序列化和XML序列化的结合使用将可以使服务端和客户端的数据交互变得更简单高效;NBear.Web组件提供了很多加 速Web开发的组件,将使您基于标准 ASP.NET方式的开发效率大大提高;同时,简单易用、性能突出的泛型持久化支持,则将使您能够将更多注意力集中到业务开发上,同时也不会有传统ORM持久化框架的性能问题和繁琐配置问题(NBear几乎不需要配置,性能则可与DAAB相当)。

    2. 高性能的XML和JSON序列化支持和灵活高效的持久化支持,也使得NBear能为开发各种类型的基于远程数据交换(Web Service、Remoting等等)的分布式应用程序提供便利.

    3. 内置的基于IoC容器和分布式服务队列的服务工厂能够使您的程序拥有良好的可伸缩性,可以完全透明地将一个普通构架的程序设置为一个分布式程序,甚至不需要修改消费端或服务实现端的任何代码,基于服务工厂的系统天然就是SOA构架,这就使得您的系统可以极小的成本和其他SOA构架进行整合。

    7.Nettier

    Nettier是一款基于CodeSmith代码生成器的框架,目前在国内有一定的使用群体,但中文文档匮乏。

    8.动软代码生成器

    一款由国人李天平开发的代码生成器,支付多种数据库平台,能生成基于PetShop的七层结构,及简单的三层结构,由于文档及示例齐全,在国内有很广泛的使用群体。

    9.SubSonic

    SubSonic是一个类似Rails的开源.Net项目,你可以把它看作是一把瑞士军刀,它可以用来构建WebSite和通过ORM方式来访问数据。SubSonic是一个非常活跃的项目,在CodePlex已经持续排名前10了,和一些微软支付的项目并列在一起,如AJAX Control Toolkit、Enterprise Library和IronPython。该项目的作者Rob Conery已被微软招安,用于专职开发SubSonic。该框架的英文文档详尽,且有丰富的视频演示教程。

    在上述罗列的9种快速开发框架中,一部分框架功能齐全、覆盖面广,但不易上手,学习曲线陡峭,且团队成员的水平参差不齐,因此将Enterprise Library、NHibernate、Spring.Net排除在外;动软代码生成器提供了完善的文档及示例,是一个不错的选择,之前团队成员也使用其进行过项目的开发,成员对它的认同感比较强,但它生成的数据访问层代码,不易修改,且生成的代码是写死的,虽然可以利用CodeSmith,MyGenerator之类的生成器制作代码生成的模板,但是其过程还是过于繁琐,所以也被除在外;iBatis.Net定位于一个半自动化的ORM框架,提供了强大的灵活性,文档资料丰富,但由于是从java社区简单移植过来,并没有很好的运用.net平台下的优秀特性,因此也被排除在外;Castle借鉴了RoR中的思想,提供了一站式的解决方案,应该说是一个不错的选择,但是它由众多的框架组成,且中英文文档资料匮乏,给基于团队的项目开发带来了难度。Nettier及NBear都是非常优秀的框架,但是均因为文档匮乏问题而排除在外。最后丙方选择使用SubSonic作为项目的快速开发框架,因为其入门文档相当齐全,且配有视频教程,极大地降低了初学者的入门门槛,且实现零配置,辅助工具与Visual Studio IDE紧密集成,简化了开发人员的操作,事实证明,在项目中应用SubSonic作为快速开发框架为整个项目的高效开发、按时交付提供了强有力的支持。

    9.案例结果分析与点评

    最后丙方按期交付了项目,获得了甲方的好评。能保质保量按期交付项目得益于以下几点:

    1. 前期工作细致、全面

    从对项目一期代码的全面研读、分析,到客户需求功能逐点逐一沟通,再到工作量较为精确的计算,都从丙方现有资源的实际情况出发,做出了较为科学合理的统筹安排,为项目开发工作的下一步切实开展奠定了基础。

    2.中期工作严格按照项目进度实施。

    在项目的开发过程中,严格执行项目进度实施,对于出现的技术瓶颈以及客户新提出的需求,则根据情况调派人员予以解决,避免因为各种外界因素扰乱项目进度的正常进行。同时不断去识别风险、监控风险、规避风险,尽早地发现问题,以便更合理的安排时间与人员去解决问题。

    3.后期以一种平和、友善、冷静的心态直面客户

        在项目的后期,项目的主体功能已经完成,剩下一些繁琐、零碎的工作,此时项目的开发人员的压力较之前减轻很多,此时甲方往往提出一些新的构想,丙方的开发人员往往情绪上非常容易激动,会全盘否定客户的想法,丙方的沟通人员克制了这种情绪,摆正了心态以一种平和、友善、冷静的心态与客户进行有效的沟通,为项目的顺利交付赢得了最后的胜利。

    从项目正式接手(2007年12月24日)至项目交付(2008年2月3日),共计41天,对于丙方而言最大的敌人是——多变的需求,一日未交付,需求就时刻在改变。最紧缺的资源是——时间,我们在和时间赛跑。最宝贵的资源是——人员,在出现项目进度延滞,遇到技术瓶颈时,只能依靠增加开发人员的投入来追赶项目的进度。最强大的武器是——沟通,当我们遇到技术瓶颈时,通过团队成员的群策群力,问题迎刃而解了;当与客户产生分歧时,通过相互的谅解,问题消失了。有效的沟通使一切的问题将不再是问题。

  • 相关阅读:
    【NOIP模拟】排序
    【NOIP模拟】企鹅矩阵
    【NOIP模拟】花花森林
    【BZOJ1045】糖果传递
    【BZOJ1271】秦腾的教学评估
    【POJ3714】Raid
    【TYVJ1424】占卜DIY
    【POJ3190】The Pilots Brothers' refrigerator
    【HDU1055】Color a Tree
    【NOIP2012】国王游戏
  • 原文地址:https://www.cnblogs.com/lexus/p/1115338.html
Copyright © 2011-2022 走看看