﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-A Za, A Za, Fighting...-随笔分类-G_其他</title><link>http://www.cppblog.com/Joe/category/14153.html</link><description>坚信：勤能补拙</description><language>zh-cn</language><lastBuildDate>Sun, 24 Jul 2011 04:05:28 GMT</lastBuildDate><pubDate>Sun, 24 Jul 2011 04:05:28 GMT</pubDate><ttl>60</ttl><item><title>Joel Spolsky给计算机专业学生的七个建议</title><link>http://www.cppblog.com/Joe/archive/2011/07/24/151738.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 24 Jul 2011 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/07/24/151738.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/151738.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/07/24/151738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/151738.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/151738.html</trackback:ping><description><![CDATA[<span style="color: #5a5a59; font-family: Tahoma, Calibri, Verdana, Geneva, sans-serif; font-size: 13px; ">导读：由于Joel Spolsky的双重身份（昔日耶鲁大学计算机系学长，今日Fog Creek软件公司的CEO），所以听听他的建议，对于当今无数困扰于就业压力的中国高校计算机专业学子来说，是大有裨益的。你们会发现，大多数建议，都在强调&#8220;软实力&#8221;的价值。<br /><br />　　如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念&#8220;热爱你的工作&#8221;，其实是一个很现代的概念。通常的看法是，工作是一种让人很不开心的事，你为了拿工资才不得不去上班。你工作的目的是为了攒下钱去干那些自己真正喜欢干的事，但是前提是你得等到65岁退休之后才行，而且还有不少条件。条件一，你的积蓄必须足够多；条件二，你没有老到走不动，你还有体力去干那些事情；条件三，你喜欢的事情不需要用到脆弱的膝盖、昏花的视力，也不要求你走上一里地不喘气，等等。<br /><br />　　我刚才说到哪里了？对了，我要提建议。<br /><br />　　<strong>毕业前练好写作</strong><br /><br />　　如果不是Linus Torvalds不断地散布福音，请问Linux操作系统会成功吗？虽然他是一个非常聪明的计算机天才，但是Linux吸引来全世界一大批志愿者的真正原因却是Linus Torvalds的表达能力。他通过电子邮件和邮件列表用书面形式传播自己的想法，最终引起了所有人的注意。<br /><br />　　你听说过现在风靡一时的&#8220;极限编程&#8221;（Extreme Programming）吗？我在这个地方不谈我对极限编程的看法，我只说如果你听过这个词，那么原因就是它的倡导者都是一些非常有才华的作家和演说家。<br /><br />　　即使我们缩小范围，将目光局限在任何一个软件开发团体中，你也会发现该团体中最有权势和影响力的程序员正是那些表达能力强的程序员，他们无论是做书面表达还是做口头表达，都能够清晰、自如、具有说服力地传达观点。此外，长得高也有助于提升影响力，不过这个不取决于你。<br /><br />　　一个普通程序员与一个优秀程序员的区别，不在于他们懂得的编程语言谁多谁少，也不在于他们喜欢用Python语言还是喜欢用Java语言，而在于他们能否与他人交流思想。如果你能说服其他人，你的力量就可以得到放大。如果你能写出清晰的注释和技术规格说明书，其他程序员就能够理解你的代码，因此他们就能在自己的代码中使用，而不必重写。如果你做不到这一点，你的代码对其他人就没有价值。如果你能为最终用户写出清晰的使用手册，其他人就能明白你的代码是用来干什么的，这是唯一让别人明白你的代码有何价值的方法。SourceForge[ ]上有许多优美的、有用的代码，但是它们都像被埋葬了一样，根本没人来用，原因就是它们的作者没有写好使用说明（或者压根就没写）。这样一来就没有人知道他们的成果，他们杰出的代码就衰亡了。<br /><br />　　如果一个程序员不会用英语写作、没有良好的写作能力，我就不会雇他。如果你能写，不管你去哪家公司工作，你很快就会发现写作技术文档的任务会落到你头上，这意味着你已经开始在放大自己的影响力了，管理层正在注意到你。<br /><br />　　大学里有些课程被公认为&#8220;写作密集型&#8221;（writing intensive）课程，这就是说为了拿到学分，你必须写作多得可怕的文字。一定要去上这样的课程！不要管学科，只要这门课每周甚至每天都要你写东西，你就去上。<br /><br />　　你还可以动手写日记或者网志。你写得越多，写作就会变得越容易。写起来越容易，你就会写得越多。这是一个良性循环。<br /><br />　　<strong>毕业前学好C语言</strong><br /><br />　　第二点我要讲的是C语言。请注意，我说的是C语言，而不是C++。虽然在实际使用中C语言已经越来越罕见，但是它仍然是当前程序员的共同语言。C语言让程序员互相沟通，更重要的是，它比你在大学中学到的&#8220;现代语言&#8221;（比如ML语言、Java语言、Python语言或者其它正在教授的流行垃圾语言）都更接近机器。你至少需要花一个学期来了解机器原理，否则你永远不可能在高级语言的层次写出高效的代码。你也永远无法开发编译器和操作系统，而它们恰恰属于目前程序员能够得到的最佳工作之列。别人也永远不会放心将大型项目的架构设计交给你。我不管你懂多少延续（continuation）、闭包（closure）、异常处理（exception handling），只要你不能解释为什么while (*s++ = *t++)；这句代码的作用是复制字符串，或者不觉得这是世界上对你来说再自然不过的事情，那么你就是在盲目无知的情况下编程。在我看来，这就好像一个医生不懂得最基本的解剖学就在开处方，他看病的根据完全是因为那些娃娃脸的医药厂商销售代表说这种药有用。<br /><br />　　<strong>毕业前学好微观经济学</strong><br /><br />　　如果你没有上过任何经济学课程，那么我首先来做一个超短的评论：经济学是这样的学科之一，刚开始学的时候轰轰烈烈，有许多有用的、言之有理的理论和可以在真实世界中得到证明的事实，等等；但是，再学下去就每况愈下，有用的东西就不多了。经济学一开始那个有用的部分正是微观经济学，它是商业领域所有重要理论的基础。跟在微观经济学后面的东西就不行了。你接下来学的是宏观经济学，如果你愿意，尽管跳过去，也不会有什么损失。宏观经济学开头的部分是利息理论，内容比方说是利率与失业之间的关系，但是怎么说呢，看上去这部分里面还没有被证实的东西多于已经被证实的东西。学完这部分，后面的内容越来越糟糕，许多经济学专业的学生实际上都变成在搞物理学，因为这样才能在华尔街上找到更好的工作。但是不管怎样，你一定要去学微观经济学，因为你必须搞懂供给和需求，你必须明白竞争优势，你必须理解什么是净现值（NPV），什么是贴现，什么是边际效用。只有这样，你才会懂得为什么生意是现在这种做法。<br /><br />　　为什么计算机系的学生也应该学经济学？因为，从经营一家公司的角度来看，比起那些不懂的程序员，一个理解基本商业规则的程序员将会更有价值。就是这么简单。我无法告诉你有多少次我是那样地充满挫折感，因为我看到了太多的提出一些疯狂的想法的程序员，这些想法在代码上也许可行，但在资本主义世界中毫无意义。如果你懂得商业规则，你就是一个更有价值的程序员，你会因此得到回报的，但是前提是你要去学习微观经济学。<br /><br />　　<strong>不要因为枯燥就不选修非计算机专业的课程</strong><br /><br />　　想提高GPA绩点的一个好方法就是多选修非计算机系的课程。请千万不要低估你的GPA的重大意义。千千万万的人事经理和招聘人员在拿到一份简历的时候，第一眼就会去看GPA，包括我也是这样。我们不会为这种做法道歉。为什么？因为GPA不反映单个的成绩，而是代表了许多个教授在一段很长的时间中，在不同的情况下，对你的表现的一个总的评估。SAT成绩难道不够吗？哈，那只不过是一场几个小时的测试罢了。GPA中包括了四年大学期间你的小论文、期中考试和课堂表现，总数有几百次之多。当然，GPA也有自己的问题，不是百分之百准确。比如，这些年来，老师对学生的打分越来越宽松，学习成绩有通货膨胀的趋势。再比如，GPA无法反映课程的难度，没人能够看出你的GPA是来自无名社区大学家政系的轻松课程还是来自加州理工学院针对研究生的量子力学课程。渐渐地，我形成了一套自己的做法，首先我会过滤掉所有来自社区大学、GPA低于2.5的简历，然后我会要求剩下的人给我寄成绩单和推荐信。我再从中发现那些成绩一贯优秀的人，而不是那些仅仅在计算机系课程中得到高分的人。<br /><br />　　为什么我要关心某人的&#8220;欧洲历史&#8221;课程成绩呢，毕竟作为雇主我要找的应该是程序员啊？何况，历史是那么枯燥，不得高分很正常。哦，这么说来，你的意思是我应该雇用你，而不用考虑一旦工作变得枯燥你会不会努力工作？别忘了，在编程工作中也有很枯燥的东西。每一项工作都有枯燥难耐的时刻。我不想雇用那些只想干有趣事情的人。<br /><br />　　<strong>选修有大量编程实践的课程</strong><br /><br />　　我依然清楚记得我发誓绝不读研究生的那一刻。那是在一门叫做&#8220;动态逻辑&#8221;的课程上，教师是活力十足的耶鲁大学教授Lenore Zuck，她是计算机系那些聪明的老师中最聪明的人之一。<br /><br />　　如今， 由于记忆力糟糕， 我已经差不多把这门课的内容忘光了，但是不管怎么说，在这里我还是想要对付着说一下。大致上，形式逻辑的意思是说，如果条件成立，你就能证明结论也成立。比如，根据形式逻辑，已知&#8220;只要成绩好，就能被雇用&#8221;，然后假定&#8220;Johnny的成绩好&#8221;，你就可以得到一个崭新的结论&#8220;Johnny会被雇用&#8221;。这完全是经典方法。但是，一个解构主义者（deconstructionist）只需要10秒钟就能破坏形式逻辑中所有有用的东西。这样一来，留给你的只是一些趣味性，而不是实用性。<br /><br />　　现在再来说动态逻辑。它与形式逻辑其实是一回事，但是必须再多考虑时间因素。比如，&#8220;你打开灯之后，就能看见自己的鞋子&#8221;，已知&#8220;灯以前是亮的&#8221;，那么这就意味着&#8220;你看见了自己的鞋子&#8221;。<br /><br />　　对于像Zuck教授那样聪明的理论家，动态逻辑充满了吸引力，因为它看上去很有希望让你在形式上证明一些计算机程序的相关理论问题。这样做说不定很有用。比如，你可以用它在形式上证明，火星漫游车的闪存卡不会发生溢出（overflow）问题，不会因而整天一遍又一遍地重启，耽误了它在那颗赤红色的星球上漫游寻找火星人马文（Marvin the Martian）。<br /><br />　　在第一堂课上，Zuck博士写满了整整两面黑板，甚至黑板旁边的墙上都写上了很多证明步骤。需要证明的问题是，有一个控制灯泡的开关，现在灯泡没有亮，这时你打开了开关，请证明灯泡将会点亮。<br /><br />　　整个证明过程复杂得不可思议，处处都是陷阱，必须十分小心。保证这个证明不出错太困难了，还不如直接相信打开开关灯就会亮。真的，虽然证明过程写满了许多块黑板，但是还是有许多中间步骤被省略了，因为如果要从形式逻辑上完整证明所有步骤，那就琐碎得无法形容了。许多步骤是用各种经典的逻辑证明方法推导得到的，包括归纳法、反证法等，甚至有些部分还是由旁听的研究生证明的。<br /><br />　　留给我们的课后作业是证明逆命题：如果灯原来是关着的，现在却亮了，那么请证明开关的状态一定同原来相反。<br /><br />　　我动手开始证明，我真的去证明了。<br /><br />　　我在图书馆里待了很长时间。<br /><br />　　我对照着Zuck博士的原始证明想依样画葫芦。研究了几个小时之后，我在其中发现了一个错误。可能我抄写的时候抄错了，但是这使得我想通了一件事。如果花费3个小时，写满了一块又一块的黑板，每一秒钟都可能出错，最后能够证明的却只是一个很琐碎的结论，那么这种方式有多大的实用性呢？在活生生、充满趣味的现实世界中，你永远都不会有机会使用它。<br /><br />　　但是，动态逻辑的理论家们对这一点不感兴趣。他们看上它不是因为它有用，而是因为它可以为他们带来终身教职。<br /><br />　　我放弃了这门课，并且发誓绝不会去读计算机科学的研究生。<br /><br />　　这个故事告诉我们，计算机科学与软件开发不是一回事。如果你真的非常幸运，你的学校可能会开设很像样的软件开发课程。但是另一种可能是，你的学校根本不教你在现实中如何编程，因为精英学校都觉得，教授工作技能最好留给职业技术学校、犯人重返社会的培训项目去做。你到处都能学怎么写代码。别忘了，我们是耶鲁大学，我们的使命是培养未来的世界领袖。你交了16万美元的学费，却在学循环语句的写法，这怎么可以？你以为这是什么地方，难道是机场沿途的酒店里临时拼凑起来不靠谱的Java语言培训班？哼哼。<br /><br />　　麻烦在于我们没有一种真正教授软件开发的专门学校。你如果想成为一个程序员，你可能只能选择计算机科学专业。这是一个不错的专业，但是它同软件开发不是一回事。在那些400等级的课程代号中，去寻找名称中带有&#8220;Practicum&#8221;这个词的课程吧（编者注：指供人实习的课程）。不要被这个拉丁语单词吓倒，这些都是有用的课程，之所以起这种名字，只是为了让那些文绉绉、装腔作势、满嘴胡说八道的公司经理们觉得高深莫测。<br /><br />　　<strong>别担心所有工作都被印度人抢走</strong><br /><br />　　我首先要说的是，如果你本身就已经在印度了，或者你就是印度人，那么你真的毫无必要去想这件事，根本不用琢磨所有的工作机会是不是都跑到了印度。那些都是非常好的工作，好好地享受吧，祝你身体健康。<br /><br />　　但是，我不断听说计算机系的入学人数下降得很厉害，已经到了危险的程度。根据我听到的说法，其中的一个原因是&#8220;学生们不愿去学一个工作机会都流向印度的专业&#8221;。这种担心大错特错，有很多理由可以反驳。首先，根据一时性的商业潮流决定个人的职业选择，这是愚蠢的。其次，即使编程工作无一幸存地都流向了印度和中国，但是学习编程本身依然是一种第一流的素质训练，可以为各种超级有趣的工作打下基础，比如业务流程工程（business process engineering）。再次，不管是在美国还是在印度，真正优秀的程序员依然是非常非常短缺的，这一点请相信我。不错，确实有相当一批失业的IT从业者在那里鼓噪，抱怨他们长时间找不到工作，但是你知道吗？即使冒着触怒这些人的风险，我还是要说，真正优秀的程序员根本不会失业。最后，你还能找到更好的专业吗？你觉得什么专业好？主修历史学？如果那样，你毕业的时候就会发现，根本没有其他选择，只能去法学院。不过我倒是知道一件事：99%的律师都痛恨他们的工作，痛恨他们当律师的每一分钟。可是，律师每周的工作时间偏偏长达90小时。就像我前面说过的：如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。<br /><br />　　不过说实话，我不觉得学生们真的有上面的想法。近年来，计算机系入学人数的下降只是回到了历史上的正常水平，因为前些年的互联网狂热使得入学人数出现了大泡沫，抬高了基数。由于这种泡沫，许多并不真的喜欢编程的人也来读计算机系。他们心里想的是，只要进了计算机系，将来就能找到诱人的高薪工作，就能获得24岁当上CEO、进行IPO的机会。谢天谢地，这些人现在都离计算机系远远的了。<br /><br />　　<strong>找一份好的暑期实习工作</strong><br /><br />　　精明的招聘负责人都知道，喜欢编程的人高中时就将牙医的信息输入了数据库，进入大学前就去过三次电脑夏令营，为校报做过内容管理系统，有过软件公司的夏季实习经历。招聘负责人就是要在你的简历上找这些东西。<br /><br />　　如果你喜欢编程， 就不要随便什么工作都答应，否则你会犯下最大的错误。不管是暑期工作，还是兼职或者其他性质的工作，只要与编程无关，就不要轻易接受。我知道，其他19岁的孩子都想去购物中心里打工，在那里折叠衬衫。但是你与他们不同，你19岁时就已经掌握了一门非常有价值的技能。将时间浪费在折叠衬衫上是很愚蠢的，等到毕业的时候，你的简历上本应该写满了一大堆与编程相关的经历。就让那些财经类的毕业生去租车公司&#8220;帮助人们满足他们租车的需要&#8221;吧，你要干的是别的事（在电视中扮演超人的Tom Welling注1除外）。<br /><br />　　为了让你的生活变得更容易一些，也为了强调这整篇文章完全是为了满足我的个人目的，我要告诉你，我的公司&#8212;&#8212;Fog Creek软件公司&#8212;&#8212;提供软件开发方面的暑期实习机会。我们非常看重简历。&#8220;比起其他公司的实习工作，你在Fog Creek最有可能学到更多的编写代码、软件开发、商业运作方面的知识。&#8221;这是去年夏天我们的一个实习生Ben说的。他会这样说，并不完全是因为我派了人到他的宿舍让他这样说。我们接受实习申请的截止日期是2月1日。一起来吧。<br /><br />　　如果你听从了我的建议，你还是有可能落得一个悲惨的下场，比如很早就卖掉了微软公司的股票，再比如拒绝了谷歌公司的工作机会，原因是你想要一间自己的可以关上门的独立办公室，或者做出了其他生命中愚蠢的决定。但是，这些可不是我的错。我一开始就告诉过你，不要听我的话。<br /><br /><br />　　本文转载自《软件随想录》(作者：Joel Spolsky ，译者: 阮一峰，2009年12月出版)</span><img src ="http://www.cppblog.com/Joe/aggbug/151738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-07-24 10:02 <a href="http://www.cppblog.com/Joe/archive/2011/07/24/151738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员技术练级攻略</title><link>http://www.cppblog.com/Joe/archive/2011/07/24/151737.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 24 Jul 2011 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/07/24/151737.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/151737.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/07/24/151737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/151737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/151737.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 来源:&nbsp;http://coolshell.cn/articles/4990.html月光博客6月12日发表了《写给新手程序员的一封信》，翻译自《An open letter to those who want to start programming》，我的朋友（他在本站的id是Mailper）告诉我，他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙，于是，我让他把...&nbsp;&nbsp;<a href='http://www.cppblog.com/Joe/archive/2011/07/24/151737.html'>阅读全文</a><img src ="http://www.cppblog.com/Joe/aggbug/151737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-07-24 09:57 <a href="http://www.cppblog.com/Joe/archive/2011/07/24/151737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1102   LC-Display (有趣的模拟)</title><link>http://www.cppblog.com/Joe/archive/2010/11/09/133113.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 09 Nov 2010 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/11/09/133113.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/133113.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/11/09/133113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/133113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/133113.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><div class="ptt" lang="en-US" style="text-align: center; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">LC-Display</div><div class="plm" style="text-align: center; font-family: Arial, Helvetica, sans-serif; font-size: 12pt; "><table align="center"><tbody><tr><td><strong>Time Limit:</strong>&nbsp;1000MS</td><td width="10px"></td><td><strong>Memory Limit:</strong>&nbsp;10000K</td></tr><tr><td><strong>Total Submissions:</strong>&nbsp;10720</td><td width="10px"></td><td><strong>Accepted:</strong>&nbsp;4221</td></tr></tbody></table></div><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Description</p><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; ">A friend of you has just bought a new computer. Until now, the most powerful computer he ever used has been a pocket calculator. Now, looking at his new computer, he is a bit disappointed, because he liked the LC-display of his calculator so much. So you decide to write a program that displays numbers in an LC-display-like style on his computer.</div><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Input</p><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; ">The input contains several lines, one for each number to be displayed. Each line contains two integers s, n (1 &lt;= s &lt;= 10, 0 &lt;= n &lt;= 99 999 999), where n is the number to be displayed and s is the size in which it shall be displayed.&nbsp;<br><br>The input file will be terminated by a line containing two zeros. This line should not be processed.</div><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Output</p><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; ">Output the numbers given in the input file in an LC-display-style using s "-" signs for the horizontal segments and s "|" signs for the vertical ones. Each digit occupies exactly s+2 columns and 2s+3 rows. (Be sure to fill all the white space occupied by the digits with blanks, also for the last digit.) There has to be exactly one column of blanks between two digits.&nbsp;<br><br>Output a blank line after each number. (You will find a sample of each digit in the sample output.)</div><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Sample Input</p><pre class="sio" style="font-family: 'Courier New', Courier, monospace; font-size: 12pt; ">2 12345
3 67890
0 0</pre><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Sample Output</p><pre class="sio" style="font-family: 'Courier New', Courier, monospace; font-size: 12pt; ">      --   --        -- 
   |    |    | |  | | 
   |    |    | |  | | 
      --   --   --   -- 
   | |       |    |    |
   | |       |    |    |
      --   --        -- 

 ---   ---   ---   ---   --- 
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   --- 
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   ---</pre><p class="pst" style="text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 18pt; font-weight: bold; color: blue; ">Source</p><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; "><a href="http://poj.org/searchproblem?field=source&amp;key=Mid-Central+European+Regional+Contest+1999" style="text-transform: none; text-decoration: none; ">Mid-Central European Regional Contest 1999</a></div><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; "><br></div><div class="ptx" lang="en-US" style="font-family: 'Times New Roman', Times, serif; font-size: 12pt; ">思路:<br>这题，不会...<br>无奈看其他人代码，发现居然可以写的这么简洁...佩服...<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;10</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n;<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;str[MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;mark[</span><span style="color: #000000; ">5</span><span style="color: #000000; ">][</span><span style="color: #000000; ">10</span><span style="color: #000000; ">][</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/* &nbsp; </span><span style="color: #008000; ">&nbsp;0 &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp;2 &nbsp; &nbsp; &nbsp; &nbsp;3 &nbsp; &nbsp; &nbsp; &nbsp;4 &nbsp; &nbsp; &nbsp; &nbsp;5 &nbsp; &nbsp; &nbsp; &nbsp;6 &nbsp; &nbsp; &nbsp; &nbsp;7 &nbsp; &nbsp; &nbsp; &nbsp;8 &nbsp; &nbsp; &nbsp; &nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp; &nbsp;&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;};<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j,&nbsp;k,&nbsp;p,&nbsp;q,&nbsp;w;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">n,&nbsp;str)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">n)<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">%</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;str[p]</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;mark[j][k][0]&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;str[p]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(q</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;q</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">n;&nbsp;q</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;mark[j][k][</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;mark[j][k][2]&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(q</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;q</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">n;&nbsp;q</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;str[p]</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;str[p]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;mark[j][k][</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]</span><span style="color: #000000; ">?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">|</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(w</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;w</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">n;&nbsp;w</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;mark[j][k][</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]</span><span style="color: #000000; ">?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">|</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">}</span></div></div></span><img src ="http://www.cppblog.com/Joe/aggbug/133113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-11-09 16:46 <a href="http://www.cppblog.com/Joe/archive/2010/11/09/133113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   原码、反码、补码</title><link>http://www.cppblog.com/Joe/archive/2010/11/05/132586.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Fri, 05 Nov 2010 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/11/05/132586.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/132586.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/11/05/132586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/132586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/132586.html</trackback:ping><description><![CDATA[转自：<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://hi.baidu.com/cive/blog/item/f6899418726669b44aedbcc9.html">http://hi.baidu.com/cive/blog/item/f6899418726669b44aedbcc9.html</a><br><br>------------------------------------------------------------------------------------------------------------------<br><br><meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="color: rgb(85, 85, 85); font-family: Georgia; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; ">数在计算机中是以二进制形式表示的。&nbsp;<br style="line-height: normal; ">数分为有符号数和无符号数。&nbsp;<br style="line-height: normal; ">原码、反码、补码都是有符号定点数的表示方法。&nbsp;<br style="line-height: normal; ">一个有符号定点数的最高位为符号位，0是正，1是副。&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">以下都以8位整数为例，&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">原码就是这个数本身的二进制形式。&nbsp;<br style="line-height: normal; ">例如<br style="line-height: normal; ">0000001 就是+1<br style="line-height: normal; ">1000001 就是-1&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">正数的反码和补码都是和原码相同。&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">负数的反码是将其原码除符号位之外的各位求反&nbsp;<br style="line-height: normal; ">[-3]反=[10000011]反=11111100&nbsp;<br style="line-height: normal; ">负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。&nbsp;<br style="line-height: normal; ">[-3]补=[10000011]补=11111101&nbsp;<br style="line-height: normal; ">一个数和它的补码是可逆的。&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">为什么要设立补码呢？&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">第一是为了能让计算机执行减法：&nbsp;<br style="line-height: normal; ">[a-b]补=a补+（-b）补&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">第二个原因是为了统一正0和负0&nbsp;<br style="line-height: normal; ">正零：00000000&nbsp;<br style="line-height: normal; ">负零：10000000&nbsp;<br style="line-height: normal; ">这两个数其实都是0，但他们的原码却有不同的表示。&nbsp;<br style="line-height: normal; ">但是他们的补码是一样的，都是00000000&nbsp;<br style="line-height: normal; ">特别注意，如果+1之后有进位的，要一直往前进位，包括符号位！（这和反码是不同的！）&nbsp;<br style="line-height: normal; ">[10000000]补&nbsp;<br style="line-height: normal; ">=[10000000]反+1&nbsp;<br style="line-height: normal; ">=11111111+1&nbsp;<br style="line-height: normal; ">=(1)00000000&nbsp;<br style="line-height: normal; ">=00000000(最高位溢出了，符号位变成了0）&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">有人会问&nbsp;<br style="line-height: normal; ">10000000这个补码表示的哪个数的补码呢？&nbsp;<br style="line-height: normal; ">其实这是一个规定，这个数表示的是-128&nbsp;<br style="line-height: normal; ">所以n位补码能表示的范围是&nbsp;<br style="line-height: normal; ">-2^(n-1)到2^(n-1)-1&nbsp;<br style="line-height: normal; ">比n位原码能表示的数多一个</p><p style="line-height: normal; "><strong style="line-height: normal; ">又例：</strong><br style="line-height: normal; ">1011&nbsp;<br style="line-height: normal; ">原码：01011&nbsp;<br style="line-height: normal; ">反码：01011 //正数时，反码＝原码&nbsp;<br style="line-height: normal; ">补码：01011 //正数时，补码＝原码&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">-1011&nbsp;<br style="line-height: normal; ">原码：11011&nbsp;<br style="line-height: normal; ">反码：10100 //负数时，反码为原码取反&nbsp;<br style="line-height: normal; ">补码：10101 //负数时，补码为原码取反＋1&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">0．1101&nbsp;<br style="line-height: normal; ">原码：0.1101&nbsp;<br style="line-height: normal; ">反码：0.1101 //正数时，反码＝原码&nbsp;<br style="line-height: normal; ">补码：0.1101 //正数时，补码＝原码&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">-0．1101&nbsp;<br style="line-height: normal; ">原码：1.1101&nbsp;<br style="line-height: normal; ">反码：1.0010 //负数时，反码为原码取反&nbsp;<br style="line-height: normal; ">补码：1.0011 //负数时，补码为原码取反＋1&nbsp;<br style="line-height: normal; "></p><p style="line-height: normal; "><strong style="line-height: normal; ">总结：</strong><br style="line-height: normal; ">在计算机内，定点数有3种表示法：原码、反码和补码</p><p style="line-height: normal; ">所谓原码就是前面所介绍的二进制定点表示法，即最高位为符号位，&#8220;0&#8221;表示正，&#8220;1&#8221;表示负，其余位表示数值的大小。</p><p style="line-height: normal; ">反码表示法规定：正数的反码与其原码相同；负数的反码是对其原码逐位取反，但符号位除外。</p><p style="line-height: normal; ">补码表示法规定：正数的补码与其原码相同；负数的补码是在其反码的末位加1。</p><p style="line-height: normal; ">1、原码、反码和补码的表示方法</p><p style="line-height: normal; ">（1）&nbsp;&nbsp;&nbsp;&nbsp; 原码：在数值前直接加一符号位的表示法。</p><p style="line-height: normal; ">例如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 符号位&nbsp;&nbsp; 数值位</p><p style="line-height: normal; ">[+7]原=&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0000111&nbsp;&nbsp; B</p><p style="line-height: normal; ">[-7]原=&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 0000111&nbsp;&nbsp; B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：a. 数0的原码有两种形式：</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [+0]原=00000000B&nbsp;&nbsp;&nbsp;&nbsp; [-0]原=10000000B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. 8位二进制原码的表示范围：-127～+127</p><p style="line-height: normal; ">2）反码：</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正数：正数的反码与原码相同。</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 负数：负数的反码，符号位为&#8220;1&#8221;，数值部分按位取反。</p><p style="line-height: normal; ">例如： 符号位&nbsp;&nbsp;&nbsp; 数值位</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [+7]反=&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0000111&nbsp;&nbsp; B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-7]反=&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1111000&nbsp;&nbsp; B</p><p style="line-height: normal; ">注意：a. 数0的反码也有两种形式，即</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [+0]反=00000000B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [- 0]反=11111111B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. 8位二进制反码的表示范围：-127～+127</p><p style="line-height: normal; ">3）补码的表示方法</p><p style="line-height: normal; ">1）模的概念：把一个计量单位称之为模或模数。例如，时钟是以12进制进行计数循环的，即以12为模。在时钟上，时针加上（正拨）12的整数位或减去（反拨）12的整数位，时针的位置不变。14点钟在舍去模12后，成为（下午）2点钟（14=14-12=2）。从0点出发逆时针拨10格即减去10小时，也可看成从0点出发顺时针拨2格（加上2小时），即2点（0-10=-10=-10+12=2）。因此，在模12的前提下，-10可映射为+2。由此可见，对于一个模数为12的循环系统来说，加2和减10的效果是一样的；因此，在以12为模的系统中，凡是减10的运算都可以用加2来代替，这就把减法问题转化成加法问题了（注：计算机的硬件结构中只有加法器，所以大部分的运算都必须最终转换为加法）。10和2对模12而言互为补数。</p><p style="line-height: normal; ">同理，计算机的运算部件与寄存器都有一定字长的限制（假设字长为8），因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出，又从头开始计数。产生溢出的量就是计数器的模，显然，8位二进制数，它的模数为28=256。在计算中，两个互补的数称为&#8220;补码&#8221;。</p><p style="line-height: normal; ">2）补码的表示： 正数：正数的补码和原码相同。</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp; 负数：负数的补码则是符号位为&#8220;1&#8221;，数值部分按位取反后再在末位（最低位）加1。也就是&#8220;反码+1&#8221;。</p><p style="line-height: normal; ">例如：&nbsp;&nbsp; 符号位 数值位</p><p style="line-height: normal; ">[+7]补=&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0000111&nbsp;&nbsp; B</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-7]补=&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1111001&nbsp;&nbsp; B</p><p style="line-height: normal; ">补码在微型机中是一种重要的编码形式，请注意：</p><p style="line-height: normal; ">a.采用补码后，可以方便地将减法运算转化成加法运算，运算过程得到简化。正数的补码即是它所表示的数的真值，而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算，所得结果仍为补码。</p><p style="line-height: normal; ">b.与原码、反码不同，数值0的补码只有一个，即&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [0]补=00000000B。</p><p style="line-height: normal; ">c.若字长为8位，则补码所表示的范围为-128～+127；进行补码运算时，应注意所得结果不应超过补码所能表示数的范围。</p></span><img src ="http://www.cppblog.com/Joe/aggbug/132586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-11-05 17:53 <a href="http://www.cppblog.com/Joe/archive/2010/11/05/132586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   位运算简介及实用技巧（一）：基础篇</title><link>http://www.cppblog.com/Joe/archive/2010/11/05/132581.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Fri, 05 Nov 2010 09:04:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/11/05/132581.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/132581.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/11/05/132581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/132581.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/132581.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="color: rgb(35, 35, 35); font-family: Tahoma, 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; font-size: 12px; line-height: 19px; ">转载:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://www.matrix67.com/blog/archives/263">http://www.matrix67.com/blog/archives/263</a><br><br>------------------------------------------------------------------------------------------------------------------<br><br>去年年底写的关于<a target="_blank" href="http://www.matrix67.com/blog/article.asp?id=153" style="text-decoration: none; color: rgb(97, 136, 152); font-weight: bold; ">位运算</a>的日志是这个Blog里少数大受欢迎的文章之一，很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料，学习到了更多关于位运算的知识，有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章，与其说是原来那篇文章的follow-up，不如说是一个remake。当然首先我还是从最基础的东西说起。<br><br><strong>什么是位运算？</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了，就是直接对整数在内存中的二进制位进行操作。比如，and运算本来是一个逻辑运算符，但整数与整数之间也可以进行and运算。举个例子，6的二进制是110，11的二进制是1011，那么6 and 11的结果就是2，它是二进制对应位进行逻辑运算的结果（0表示False，1表示True，空位都当0处理）：<br><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp; 110<br>AND 1011<br>----------<br>&nbsp;&nbsp;&nbsp;&nbsp;0010&nbsp;&nbsp;--&gt;&nbsp;&nbsp;2</span><br>&nbsp;&nbsp;&nbsp;&nbsp;由于位运算直接对内存数据进行操作，不需要转成十进制，因此处理速度非常快。当然有人会说，这个快了有什么用，计算6 and 11没有什么实际意义啊。这一系列的文章就将告诉你，位运算到底可以干什么，有些什么经典应用，以及如何用位运算优化你的程序。<br><br><br><strong>Pascal和C中的位运算符号</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;下面的a和b都是整数类型，则：<br><span style="font-family: 宋体; ">C语言&nbsp;&nbsp;|&nbsp;&nbsp;Pascal语言<br>-------+-------------<br>a &amp; b&nbsp;&nbsp;|&nbsp;&nbsp;a and b<br>a | b&nbsp;&nbsp;|&nbsp;&nbsp;a or b<br>a ^ b&nbsp;&nbsp;|&nbsp;&nbsp;a xor b<br>&nbsp;&nbsp;~a&nbsp;&nbsp; |&nbsp;&nbsp; not a<br>a &lt;&lt; b |&nbsp;&nbsp;a shl b<br>a &gt;&gt; b |&nbsp;&nbsp;a shr b</span><br>&nbsp;&nbsp;&nbsp;&nbsp;注意C中的逻辑运算和位运算符号是不同的。520|1314=1834，但520||1314=1，因为逻辑运算时520和1314都相当于True。同样的，!a和~a也是有区别的。<br><br><br><strong>各种位运算的使用</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 1. and运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;and运算通常用于二进制取位操作，例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶，二进制的最末位为0表示该数为偶数，最末位为1表示该数为奇数.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 2. or运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;or运算通常用于二进制特定位上的无条件赋值，例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0，对这个数or 1之后再减一就可以了，其实际意义就是把这个数强行变成最接近的偶数。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 3. xor运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;xor运算通常用于对二进制的特定一位进行取反操作，因为异或可以这样定义：0和1异或0都不变，异或1则取反。<br>&nbsp;&nbsp;&nbsp;&nbsp;xor运算的逆运算是它本身，也就是说两次异或同一个数最后结果不变，即(a xor b) xor b = a。xor运算可以用于简单的加密，比如我想对我MM说1314520，但怕别人知道，于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500，我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值，得到1314520，于是她就明白了我的企图。<br>&nbsp;&nbsp;&nbsp;&nbsp;下面我们看另外一个东西。定义两个符号#和@（我怎么找不到那个圈里有个叉的字符），这两个符号互为逆运算，也就是说(x # y) @ y = x。现在依次执行下面三条命令，结果是什么？<br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">x &lt;- x # y<br>y &lt;- x @ y<br>x &lt;- x @ y</code><br>&nbsp;&nbsp;&nbsp;&nbsp;执行了第一句后x变成了x # y。那么第二句实质就是y &lt;- x # y @ y，由于#和@互为逆运算，那么此时的y变成了原来的x。第三句中x实际上被赋值为(x # y) @ x，如果#运算具有交换律，那么赋值后x就变成最初的y了。这三句话的结果是，x和y的位置互换了。<br>&nbsp;&nbsp;&nbsp;&nbsp;加法和减法互为逆运算，并且加法满足交换律。把#换成+，把@换成-，我们可以写出一个不需要临时变量的swap过程(Pascal)。<br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">procedure swap(var a,b:longint);<br>begin<br>&nbsp;&nbsp; a:=a + b;<br>&nbsp;&nbsp; b:=a - b;<br>&nbsp;&nbsp; a:=a - b;<br>end;</code><br>&nbsp;&nbsp;&nbsp;&nbsp;好了，刚才不是说xor的逆运算是它本身吗？于是我们就有了一个看起来非常诡异的swap过程：<br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">procedure swap(var a,b:longint);<br>begin<br>&nbsp;&nbsp; a:=a xor b;<br>&nbsp;&nbsp; b:=a xor b;<br>&nbsp;&nbsp; a:=a xor b;<br>end;</code><br><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 4. not运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;not运算的定义是把内存中的0和1全部取反。使用not运算时要格外小心，你需要注意整数类型有没有符号。如果not的对象是无符号整数（不能表示负数），那么得到的值就是它与该类型上界的差，因为无符号类型的数是用$0000到$FFFF依次表示的。下面的两个程序（仅语言不同）均返回65435。<br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">var<br>&nbsp;&nbsp; a:word;<br>begin<br>&nbsp;&nbsp; a:=100;<br>&nbsp;&nbsp; a:=not a;<br>&nbsp;&nbsp; writeln(a);<br>end.</code><br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">#include &lt;stdio.h&gt;<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned short a=100;<br>&nbsp;&nbsp;&nbsp;&nbsp;a = ~a;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf( "%d\n", a );&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</code><br>&nbsp;&nbsp;&nbsp;&nbsp;如果not的对象是有符号的整数，情况就不一样了，稍后我们会在&#8220;整数类型的储存&#8221;小节中提到。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 5. shl运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;a shl b就表示把a转为二进制后左移b位（在后面添b个0）。例如100的二进制为1100100，而110010000转成十进制是400，那么100 shl 2 = 400。可以看出，a shl b的值实际上就是a乘以2的b次方，因为在二进制数后添一个0就相当于该数乘以2。<br>&nbsp;&nbsp;&nbsp;&nbsp;通常认为a shl 1比a * 2更快，因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。<br>&nbsp;&nbsp;&nbsp;&nbsp;定义一些常量可能会用到shl运算。你可以方便地用1 shl 16 - 1来表示65535。很多算法和数据结构要求数据规模必须是2的幂，此时可以用shl来定义Max_N等常量。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;=== 6. shr运算 ===<br>&nbsp;&nbsp;&nbsp;&nbsp;和shl相似，a shr b表示二进制右移b位（去掉末b位），相当于a除以2的b次方（取整）。我们也经常用shr 1来代替div 2，比如二分查找、堆的插入操作等等。想办法用shr代替除法运算可以使程序效率大大提高。最大公约数的二进制算法用除以2操作来代替慢得出奇的mod运算，效率可以提高60%。<br><br><br><strong>位运算的简单应用</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;有时我们的程序需要一个规模不大的Hash表来记录状态。比如，做数独时我们需要27个Hash表来统计每一行、每一列和每一个小九宫格里已经有哪些数了。此时，我们可以用27个小于2^9的整数进行记录。例如，一个只填了2和5的小九宫格就用数字18表示（二进制为000010010），而某一行的状态为511则表示这一行已经填满。需要改变状态时我们不需要把这个数转成二进制修改后再转回去，而是直接进行位操作。在搜索时，把状态表示成整数可以更好地进行判重等操作。<a target="_blank" href="http://www.vijos.cn/Problem_Show.asp?id=1197" style="text-decoration: none; color: rgb(97, 136, 152); font-weight: bold; ">这道题</a>是在搜索中使用位运算加速的经典例子。以后我们会看到更多的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;下面列举了一些常见的二进制位的变换操作。<br><br><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;功能&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;位运算<br>----------------------+---------------------------+--------------------<br>去掉最后一位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (101101-&gt;10110)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x shr 1<br>在最后加一个0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101101-&gt;1011010)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x shl 1<br>在最后加一个1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101101-&gt;1011011)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x shl 1+1<br>把最后一位变成1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101100-&gt;101101)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x or 1<br>把最后一位变成0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101101-&gt;101100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x or 1-1<br>最后一位取反&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (101101-&gt;101100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x xor 1<br>把右数第k位变成1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (101001-&gt;101101,k=3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x or (1 shl (k-1))<br>把右数第k位变成0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (101101-&gt;101001,k=3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x and not (1 shl (k-1))<br>右数第k位取反&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101001-&gt;101101,k=3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x xor (1 shl (k-1))<br>取末三位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (1101101-&gt;101)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x and 7<br>取末k位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (1101101-&gt;1101,k=5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x and (1 shl k-1)<br>取右数第k位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (1101101-&gt;1,k=4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x shr (k-1) and 1<br>把末k位变成1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (101001-&gt;101111,k=4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x or (1 shl k-1)<br>末k位取反&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (101001-&gt;100110,k=4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x xor (1 shl k-1)<br>把右边连续的1变成0&nbsp;&nbsp;&nbsp;&nbsp;| (100101111-&gt;100100000)&nbsp;&nbsp;&nbsp;&nbsp;| x and (x+1)<br>把右起第一个0变成1&nbsp;&nbsp;&nbsp;&nbsp;| (100101111-&gt;100111111)&nbsp;&nbsp;&nbsp;&nbsp;| x or (x+1)<br>把右边连续的0变成1&nbsp;&nbsp;&nbsp;&nbsp;| (11011000-&gt;11011111)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| x or (x-1)<br>取右边连续的1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (100101111-&gt;1111)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (x xor (x+1)) shr 1<br>去掉右起第一个1的左边 | (100101000-&gt;1000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x and (x xor (x-1))</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;最后这一个在树状数组中会用到。<br><br><br><strong>Pascal和C中的16进制表示</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;Pascal中需要在16进制数前加$符号表示，C中需要在前面加0x来表示。这个以后我们会经常用到。<br><br><strong>整数类型的储存</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;我们前面所说的位运算都没有涉及负数，都假设这些运算是在unsigned/word类型（只能表示正数的整型）上进行操作。但计算机如何处理有正负符号的整数类型呢？下面两个程序都是考察16位整数的储存方式（只是语言不同）。<br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">var<br>&nbsp;&nbsp; a,b:integer;<br>begin<br>&nbsp;&nbsp; a:=$0000;<br>&nbsp;&nbsp; b:=$0001;<br>&nbsp;&nbsp; write(a,' ',b,' ');<br>&nbsp;&nbsp; a:=$FFFE;<br>&nbsp;&nbsp; b:=$FFFF;<br>&nbsp;&nbsp; write(a,' ',b,' ');<br>&nbsp;&nbsp; a:=$7FFF;<br>&nbsp;&nbsp; b:=$8000;<br>&nbsp;&nbsp; writeln(a,' ',b);<br>end.</code><br><code style="overflow-x: auto; overflow-y: auto; display: block; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 4px; margin-top: 3px; margin-right: 60px; margin-bottom: 3px; margin-left: 20px; line-height: 16px; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(115, 115, 115); border-right-color: rgb(115, 115, 115); border-bottom-color: rgb(115, 115, 115); border-left-color: rgb(115, 115, 115); color: rgb(10, 10, 10); font-family: 'Courier New', Consolas, Verdana, sans-serif; ">#include &lt;stdio.h&gt;<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;short int a, b;<br>&nbsp;&nbsp;&nbsp;&nbsp;a = 0x0000;<br>&nbsp;&nbsp;&nbsp;&nbsp;b = 0x0001;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf( "%d %d ", a, b );<br>&nbsp;&nbsp;&nbsp;&nbsp;a = 0xFFFE;<br>&nbsp;&nbsp;&nbsp;&nbsp;b = 0xFFFF;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf( "%d %d ", a, b );<br>&nbsp;&nbsp;&nbsp;&nbsp;a = 0x7FFF;<br>&nbsp;&nbsp;&nbsp;&nbsp;b = 0x8000;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf( "%d %d\n", a, b );<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</code><br>&nbsp;&nbsp;&nbsp;&nbsp;两个程序的输出均为0 1 -2 -1 32767 -32768。其中前两个数是内存值最小的时候，中间两个数则是内存值最大的时候，最后输出的两个数是正数与负数的分界处。由此你可以清楚地看到计算机是如何储存一个整数的：计算机用$0000到$7FFF依次表示0到32767的数，剩下的$8000到$FFFF依次表示-32768到-1的数。32位有符号整数的储存方式也是类似的。稍加注意你会发现，二进制的第一位是用来表示正负号的，0表示正，1表示负。这里有一个问题：0本来既不是正数，也不是负数，但它占用了$0000的位置，因此有符号的整数类型范围中正数个数比负数少一个。对一个有符号的数进行not运算后，最高位的变化将导致正负颠倒，并且数的绝对值会差1。也就是说，not a实际上等于-a-1。这种整数储存方式叫做&#8220;补码&#8221;。</span>
<img src ="http://www.cppblog.com/Joe/aggbug/132581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-11-05 17:04 <a href="http://www.cppblog.com/Joe/archive/2010/11/05/132581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   GCC编译静态和动态库</title><link>http://www.cppblog.com/Joe/archive/2010/11/02/132102.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 02 Nov 2010 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/11/02/132102.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/132102.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/11/02/132102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/132102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/132102.html</trackback:ping><description><![CDATA[转自:&nbsp;<meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://blog.chinaunix.net/u3/98913/showart_2004280.html">http://blog.chinaunix.net/u3/98913/showart_2004280.html</a><br><br><meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><p style="font: normal normal normal 12px/normal song, Verdana; ">我们通常把一些公用函数制作成函数库，供其它程序使用。函数库分为静态库和动态库两<br style="font: normal normal normal 12px/normal song, Verdana; ">种。静态库在程序编译时会被连接到目标代码中，程序运行时将不再需要该静态库。动态<br style="font: normal normal normal 12px/normal song, Verdana; ">库在程序编译时并不会被连接到目标代码中，而是在程序运行是才被载入，因此在程序运<br style="font: normal normal normal 12px/normal song, Verdana; ">行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库，以<br style="font: normal normal normal 12px/normal song, Verdana; ">及使用它们。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在创建函数库前，我们先来准备举例用的源程序，并将函数库的源程序编译成.o文件。</p><p style="font: normal normal normal 12px/normal song, Verdana; "><br style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第1步</font>：编辑得到举例的程序--hello.h、hello.c和main.c；</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c(见程序2)是函数库的源程序，其中包含公用函数hello，该函数将在屏幕上输出"<br style="font: normal normal normal 12px/normal song, Verdana; ">Hello XXX!"。hello.h(见程序1)为该函数库的头文件。main.c(见程序3)为测试库文件的<br style="font: normal normal normal 12px/normal song, Verdana; ">主程序，在主程序中调用了公用函数hello。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#ifndef HELLO_H<br style="font: normal normal normal 12px/normal song, Verdana; ">#define HELLO_H</p><p style="font: normal normal normal 12px/normal song, Verdana; ">void hello(const char *name);</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#endif //HELLO_H<br style="font: normal normal normal 12px/normal song, Verdana; ">程序1: hello.h</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#include &lt;stdio.h&gt;</p><p style="font: normal normal normal 12px/normal song, Verdana; ">void hello(const char *name)<br style="font: normal normal normal 12px/normal song, Verdana; ">{<br style="font: normal normal normal 12px/normal song, Verdana; ">printf("Hello %s!\n", name);<br style="font: normal normal normal 12px/normal song, Verdana; ">}<br style="font: normal normal normal 12px/normal song, Verdana; ">程序2: hello.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#include "hello.h"</p><p style="font: normal normal normal 12px/normal song, Verdana; ">int main()<br style="font: normal normal normal 12px/normal song, Verdana; ">{<br style="font: normal normal normal 12px/normal song, Verdana; ">hello("everyone");<br style="font: normal normal normal 12px/normal song, Verdana; ">return 0;<br style="font: normal normal normal 12px/normal song, Verdana; ">}<br style="font: normal normal normal 12px/normal song, Verdana; ">程序3: main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第2步</font>：将hello.c编译成.o文件；</p><p style="font: normal normal normal 12px/normal song, Verdana; ">无论静态库，还是动态库，都是由.o文件创建的。因此，我们必须将源程序hello.c通过g<br style="font: normal normal normal 12px/normal song, Verdana; ">cc先编译成.o文件。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在系统提示符下键入以下命令得到hello.o文件。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># gcc -c hello.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们运行ls命令看看是否生存了hello.o文件。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ls</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c hello.h hello.o main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; "><br style="font: normal normal normal 12px/normal song, Verdana; ">在ls命令结果中，我们看到了hello.o文件，本步操作完成。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">下面我们先来看看如何创建静态库，以及使用它。</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第3步</font>：由.o文件创建静态库；</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#ff0000">静态库文件名的命名规范是以lib为前缀，紧接着跟静态库名，扩展名为.a。</font>例如：我们将<br style="font: normal normal normal 12px/normal song, Verdana; ">创建的静态库名为myhello，则静态库文件名就是libmyhello.a。在创建和使用静态库时，<br style="font: normal normal normal 12px/normal song, Verdana; ">需要注意这点。创建静态库用ar命令。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在系统提示符下键入以下命令将创建静态库文件libmyhello.a。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ar crv libmyhello.a hello.o</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们同样运行ls命令查看结果：</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ls</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c hello.h hello.o libmyhello.a main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">ls命令结果中有libmyhello.a。</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第4步</font>：在程序中使用静态库；</p><p style="font: normal normal normal 12px/normal song, Verdana; ">静态库制作完了，如何使用它内部的函数呢？<font color="#ff0000">只需要在使用到这些公用函数的源程序中包<br style="font: normal normal normal 12px/normal song, Verdana; ">含这些公用函数的原型声明，然后在用gcc命令生成目标文件时指明静态库名，gcc将会从<br style="font: normal normal normal 12px/normal song, Verdana; ">静态库中将公用函数连接到目标文件中。</font>注意，gcc会在静态库名前加上前缀lib，然后追<br style="font: normal normal normal 12px/normal song, Verdana; ">加扩展名.a得到的静态库文件名来查找静态库文件。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在程序3:main.c中，我们包含了静态库的头文件hello.h，然后在主程序main中直接调用公<br style="font: normal normal normal 12px/normal song, Verdana; ">用函数hello。下面先生成目标程序hello，然后运行hello程序看看结果如何。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">(# gcc -o hello main.c -L. -lmyhello??)</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#gcc main.c libmyhello.a -o main</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ./hello</p><p style="font: normal normal normal 12px/normal song, Verdana; ">Hello everyone!</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># rm libmyhello.a</p><p style="font: normal normal normal 12px/normal song, Verdana; ">rm: remove regular file `libmyhello.a'? y</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ./hello</p><p style="font: normal normal normal 12px/normal song, Verdana; ">Hello everyone!</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">程序照常运行，静态库中的公用函数已经连接到目标文件中了。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第5步</font>：由.o文件创建动态库文件；</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#ff0000">动态库文件名命名规范和静态库文件名命名规范类似，也是在动态库名增加前缀lib，但其<br style="font: normal normal normal 12px/normal song, Verdana; ">文件扩展名为.so。</font>例如：我们将创建的动态库名为myhello，则动态库文件名就是libmyh<br style="font: normal normal normal 12px/normal song, Verdana; ">ello.so。用gcc来创建动态库。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在系统提示符下键入以下命令得到动态库文件libmyhello.so。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#&nbsp;<font color="#ff0000">gcc -shared -fPCI -o libmyhello.so hello.o</font></p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们照样使用ls命令看看动态库文件是否生成。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ls</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c hello.h hello.o libmyhello.so main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">第6步</font>：在程序中使用动态库；</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在程序中使用动态库和使用静态库完全一样，也是在使用到这些公用函数的源程序中包含<br style="font: normal normal normal 12px/normal song, Verdana; ">这些公用函数的原型声明，然后在用gcc命令生成目标文件时指明动态库名进行编译。我们<br style="font: normal normal normal 12px/normal song, Verdana; ">先运行gcc命令生成目标文件，再运行它看看结果。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># gcc -o hello main.c -L. -lmyhello</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ./hello</p><p style="font: normal normal normal 12px/normal song, Verdana; ">./hello: error while loading shared libraries: libmyhello.so: cannot open shar<br style="font: normal normal normal 12px/normal song, Verdana; ">ed object file: No such file or directory</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">哦！出错了。快看看错误提示，原来是找不到动态库文件libmyhello.so。<font color="#ff0000">程序在运行时，<br style="font: normal normal normal 12px/normal song, Verdana; ">会在/usr/lib和/lib等目录中查找需要的动态库文件。</font>若找到，则载入动态库，否则将提<br style="font: normal normal normal 12px/normal song, Verdana; ">示类似上述错误而终止程序运行。我们将文件libmyhello.so复制到目录/usr/lib中，再试<br style="font: normal normal normal 12px/normal song, Verdana; ">试。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># mv libmyhello.so /usr/lib</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ./hello</p><p style="font: normal normal normal 12px/normal song, Verdana; ">Hello everyone!</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">成功了。这也进一步说明了动态库在程序运行时是需要的。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我们回过头看看，发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样，<br style="font: normal normal normal 12px/normal song, Verdana; ">那当静态库和动态库同名时，gcc命令会使用哪个库文件呢？抱着对问题必究到底的心情，<br style="font: normal normal normal 12px/normal song, Verdana; ">来试试看。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">先删除除.c和.h外的所有文件，恢复成我们刚刚编辑完举例程序状态。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># rm -f hello hello.o /usr/lib/libmyhello.so</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ls</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c hello.h main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># gcc -c hello.c</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ar cr libmyhello.a hello.o</p><p style="font: normal normal normal 12px/normal song, Verdana; "># gcc -shared -fPCI -o libmyhello.so hello.o</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ls</p><p style="font: normal normal normal 12px/normal song, Verdana; ">hello.c hello.h hello.o libmyhello.a libmyhello.so main.c</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">通过上述最后一条ls命令，可以发现静态库文件libmyhello.a和动态库文件libmyhello.s<br style="font: normal normal normal 12px/normal song, Verdana; ">o都已经生成，并都在当前目录中。然后，我们运行gcc命令来使用函数库myhello生成目标<br style="font: normal normal normal 12px/normal song, Verdana; ">文件hello，并运行程序 hello。</p><p style="font: normal normal normal 12px/normal song, Verdana; "># gcc -o hello main.c -L. -lmyhello</p><p style="font: normal normal normal 12px/normal song, Verdana; "># ./hello</p><p style="font: normal normal normal 12px/normal song, Verdana; ">./hello: error while loading shared libraries: libmyhello.so: cannot open shar<br style="font: normal normal normal 12px/normal song, Verdana; ">ed object file: No such file or directory</p><p style="font: normal normal normal 12px/normal song, Verdana; ">#</p><p style="font: normal normal normal 12px/normal song, Verdana; ">从程序hello运行的结果中很容易知道，<font color="#ff0000">当静态库和动态库同名时， gcc命令将优先使用动<br style="font: normal normal normal 12px/normal song, Verdana; ">态库。</font></p><p style="font: normal normal normal 12px/normal song, Verdana; "><font color="#0000ff">Note:<br style="font: normal normal normal 12px/normal song, Verdana; "></font>编译参数解析<br style="font: normal normal normal 12px/normal song, Verdana; ">最主要的是GCC命令行的一个选项:<br style="font: normal normal normal 12px/normal song, Verdana; "><font color="#ff0000">-shared 该选项指定生成动态连接库</font>（让连接器生成T类型的导出符号表，有时候也生成弱连接W类型的导出符号），不用该标志外部程序无法连接。相当于一个可执行文件<br style="font: normal normal normal 12px/normal song, Verdana; ">l&nbsp;<font color="#ff0000">-fPIC：表示编译为位置独立的代码，</font>不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要，而不能达到真正代码段共享的目的。<br style="font: normal normal normal 12px/normal song, Verdana; ">l -L.：表示要连接的库在当前目录中<br style="font: normal normal normal 12px/normal song, Verdana; ">l -ltest：编译器查找动态连接库时有隐含的命名规则，即在给出的名字前面加上lib，后面加上.so来确定库的名称<br style="font: normal normal normal 12px/normal song, Verdana; ">l LD_LIBRARY_PATH：这个环境变量指示动态连接器可以装载动态库的路径。<br style="font: normal normal normal 12px/normal song, Verdana; ">l 当然如果有root权限的话，可以修改/etc/ld.so.conf文件，然后调用 /sbin/ldconfig来达到同样的目的，不过如果没有root权限，那么只能采用输出LD_LIBRARY_PATH的方法了。</p>调用动态库的时候有几个问题会经常碰到，有时，明明已经将库的头文件所在目录 通过 &#8220;-I&#8221; include进来了，库所在文件通过 &#8220;-L&#8221;参数引导，并指定了&#8220;-l&#8221;的库名，但通过ldd命令察看时，就是死活找不到你指定链接的so文件，这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。</span><img src ="http://www.cppblog.com/Joe/aggbug/132102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-11-02 10:59 <a href="http://www.cppblog.com/Joe/archive/2010/11/02/132102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   Trie树|字典树的简介及实现</title><link>http://www.cppblog.com/Joe/archive/2010/11/01/131993.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Mon, 01 Nov 2010 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/11/01/131993.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/131993.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/11/01/131993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/131993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/131993.html</trackback:ping><description><![CDATA[<br><font face=楷体_GB2312>Trie,又称字典树、单词查找树,是一种树形结构，用于保存大量的字符串。它的优点是：利用字符串的公共前缀来节约存储空间。<br>相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.<br></font>
<p><font face=楷体_GB2312 size=3>其基本性质可以归纳为：<br>1. 根节点不包含字符，除根节点外每一个节点都只包含一个字符。 <br>2. 从根节点到某一节点，路径上经过的字符连接起来，为该节点对应的字符串。 <br>3. 每个节点的所有子节点包含的字符都不相同。</font></p>
<p><font face=楷体_GB2312 size=3>其基本操作有:查找 插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.</font></p>
<p><font face=楷体_GB2312 size=3><span>搜索字典项目的方法为：</span></font></p>
<p><font face=楷体_GB2312 size=3><span>(1) 从根结点开始一次搜索；</span><span><br></span></font></p>
<p><font face=楷体_GB2312 size=3><span>(2) 取得要查找关键词的第一个字母，并根据该字母选择对应的子树并转到该子树继续进行检索；<br></span></font><font face=楷体_GB2312 size=3><span>(3) 在相应的子树上，取得要查找关键词的第二个字母,</span>并进一步选择对应的子树进行检索。<br></font><font face=楷体_GB2312 size=3><span>(4) 迭代过程&#8230;&#8230;<br></span></font><font face=楷体_GB2312 size=3><span>(5) 在某个结点处，关键词的所有字母已被取出，则读取</span>附在该结点上的信息，即完成查找。<br>其他操作类似处理.<br><br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="COLOR: rgb(75,75,75); LINE-HEIGHT: 20px; FONT-FAMILY: 楷体_GB2312, verdana, Arial, helvetica, sans-seriff"><img height=325 alt="" src="http://www.cppblog.com/images/cppblog_com/abilitytao/Trie.jpg" width=388 border=0><br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_0_73_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_73_Open_Text.style.display='none'; Codehighlighter1_0_73_Closed_Image.style.display='inline'; Codehighlighter1_0_73_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_73_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_73_Closed_Text.style.display='none'; Codehighlighter1_0_73_Open_Image.style.display='inline'; Codehighlighter1_0_73_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_73_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_0_73_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Name:&nbsp;Trie树的基本实现&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Author:&nbsp;MaiK&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>Description:&nbsp;Trie树的基本实现&nbsp;,包括查找&nbsp;插入和删除操作</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sonnum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Trie<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_178_388_Open_Image onclick="this.style.display='none'; Codehighlighter1_178_388_Open_Text.style.display='none'; Codehighlighter1_178_388_Closed_Image.style.display='inline'; Codehighlighter1_178_388_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_178_388_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_178_388_Closed_Text.style.display='none'; Codehighlighter1_178_388_Open_Image.style.display='inline'; Codehighlighter1_178_388_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_178_388_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_178_388_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">to&nbsp;remember&nbsp;how&nbsp;many&nbsp;word&nbsp;can&nbsp;reach&nbsp;here,that&nbsp;is&nbsp;to&nbsp;say,prefix</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;terminal;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">If&nbsp;terminal==true&nbsp;,the&nbsp;current&nbsp;point&nbsp;has&nbsp;no&nbsp;following&nbsp;point</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">son[sonnum];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">the&nbsp;following&nbsp;point</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">NewTrie()</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;create&nbsp;a&nbsp;new&nbsp;node</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img id=Codehighlighter1_427_557_Open_Image onclick="this.style.display='none'; Codehighlighter1_427_557_Open_Text.style.display='none'; Codehighlighter1_427_557_Closed_Image.style.display='inline'; Codehighlighter1_427_557_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_427_557_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_427_557_Closed_Text.style.display='none'; Codehighlighter1_427_557_Open_Image.style.display='inline'; Codehighlighter1_427_557_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_427_557_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_427_557_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Trie;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">num</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">terminal</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sonnum;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;temp;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Insert(Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pnt,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;insert&nbsp;a&nbsp;new&nbsp;word&nbsp;to&nbsp;Trie&nbsp;tree</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #008000"><img id=Codehighlighter1_631_864_Open_Image onclick="this.style.display='none'; Codehighlighter1_631_864_Open_Text.style.display='none'; Codehighlighter1_631_864_Closed_Image.style.display='inline'; Codehighlighter1_631_864_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_631_864_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_631_864_Closed_Text.style.display='none'; Codehighlighter1_631_864_Open_Image.style.display='inline'; Codehighlighter1_631_864_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_631_864_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_631_864_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">pnt;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_684_837_Open_Image onclick="this.style.display='none'; Codehighlighter1_684_837_Open_Text.style.display='none'; Codehighlighter1_684_837_Closed_Image.style.display='inline'; Codehighlighter1_684_837_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_684_837_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_684_837_Closed_Text.style.display='none'; Codehighlighter1_684_837_Open_Image.style.display='inline'; Codehighlighter1_684_837_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_684_837_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_684_837_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NewTrie();<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">num</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">terminal</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Delete(Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pnt)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;delete&nbsp;the&nbsp;whole&nbsp;tree</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">35</span><span style="COLOR: #008000"><img id=Codehighlighter1_913_1059_Open_Image onclick="this.style.display='none'; Codehighlighter1_913_1059_Open_Text.style.display='none'; Codehighlighter1_913_1059_Closed_Image.style.display='inline'; Codehighlighter1_913_1059_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_913_1059_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_913_1059_Closed_Text.style.display='none'; Codehighlighter1_913_1059_Open_Image.style.display='inline'; Codehighlighter1_913_1059_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_913_1059_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_913_1059_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pnt</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img id=Codehighlighter1_937_1057_Open_Image onclick="this.style.display='none'; Codehighlighter1_937_1057_Open_Text.style.display='none'; Codehighlighter1_937_1057_Closed_Image.style.display='inline'; Codehighlighter1_937_1057_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_937_1057_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_937_1057_Closed_Text.style.display='none'; Codehighlighter1_937_1057_Open_Image.style.display='inline'; Codehighlighter1_937_1057_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_937_1057_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_937_1057_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sonnum;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pnt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[i]</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)Delete(pnt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[i]);<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pnt;&nbsp;<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pnt</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Trie</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Find(Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pnt,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">trie&nbsp;to&nbsp;find&nbsp;the&nbsp;current&nbsp;word</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">44</span><span style="COLOR: #008000"><img id=Codehighlighter1_1130_1287_Open_Image onclick="this.style.display='none'; Codehighlighter1_1130_1287_Open_Text.style.display='none'; Codehighlighter1_1130_1287_Closed_Image.style.display='inline'; Codehighlighter1_1130_1287_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1130_1287_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1130_1287_Closed_Text.style.display='none'; Codehighlighter1_1130_1287_Open_Image.style.display='inline'; Codehighlighter1_1130_1287_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1130_1287_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1130_1287_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Trie&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">pnt;<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">son[s[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;temp;<br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;</span></div>
</span></span></font>
<img src ="http://www.cppblog.com/Joe/aggbug/131993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-11-01 15:28 <a href="http://www.cppblog.com/Joe/archive/2010/11/01/131993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MileStone [PKU 150]</title><link>http://www.cppblog.com/Joe/archive/2010/10/31/131919.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 31 Oct 2010 12:22:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/31/131919.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/131919.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/31/131919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/131919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/131919.html</trackback:ping><description><![CDATA[今天，终于达到150题啦(*^__^*) 嘻嘻&#8230;&#8230;继续加油<br><br><img src="http://www.cppblog.com/images/cppblog_com/joe/150.png" id="" width="699" height="451" vspace="0" hspace="0" border="" align="baseline" alt="" longdesc=""><img src ="http://www.cppblog.com/Joe/aggbug/131919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-31 20:22 <a href="http://www.cppblog.com/Joe/archive/2010/10/31/131919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1016   Numbers That Count</title><link>http://www.cppblog.com/Joe/archive/2010/10/31/131918.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 31 Oct 2010 12:19:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/31/131918.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/131918.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/31/131918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/131918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/131918.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=1016">http://poj.org/problem?id=1016</a><br><br>思路:<br>纯模拟，需要细心...<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;NUM&nbsp;10&nbsp;/*&nbsp;0..9&nbsp;*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;UP&nbsp;15&nbsp;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;INPUT_LEN&nbsp;81</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;31</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;input[INPUT_LEN],&nbsp;inv[UP][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count[NUM];&nbsp;<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">generate(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">src,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dst)<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;index,&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strlen(src);<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(count,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(count));<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">len;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">count[src[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">];<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">NUM;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(count[i]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(count[i]&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst[index</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(count[i]</span><span style="color: #000000; ">/</span><span style="color: #000000; ">10</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst[index</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(count[i]</span><span style="color: #000000; ">%</span><span style="color: #000000; ">10</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst[index</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;count[i]</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst[index</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;generate(input,&nbsp;inv[index]);<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(strcmp(input,&nbsp;inv[index])&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;is&nbsp;self-inventorying\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input);<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">index;<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(index&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;UP)&nbsp;{<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate(inv[index</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],&nbsp;inv[index]);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(strcmp(inv[index],&nbsp;inv[index</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;is&nbsp;self-inventorying&nbsp;after&nbsp;%d&nbsp;steps\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input,&nbsp;index);<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">index</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(strcmp(inv[index],&nbsp;inv[i])&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;enters&nbsp;an&nbsp;inventory&nbsp;loop&nbsp;of&nbsp;length&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input,&nbsp;index</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i);<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(index&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(strcmp(inv[index],&nbsp;input)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;enters&nbsp;an&nbsp;inventory&nbsp;loop&nbsp;of&nbsp;length&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input,&nbsp;index</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">index;<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;can&nbsp;not&nbsp;be&nbsp;classified&nbsp;after&nbsp;15&nbsp;iterations\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input);<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;input)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(strcmp(input,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(inv,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(inv));<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/131918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-31 20:19 <a href="http://www.cppblog.com/Joe/archive/2010/10/31/131918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1657   Distance on Chessboard</title><link>http://www.cppblog.com/Joe/archive/2010/10/29/131688.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Thu, 28 Oct 2010 17:31:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/29/131688.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/131688.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/29/131688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/131688.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/131688.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=1657">http://poj.org/problem?id=1657</a><br><br>思路:<br>原本以为是搜索题，结果发现居然都可以推导出来(*^__^*) 嘻嘻&#8230;&#8230;0MS<br>睡觉前AC个题，感觉蛮好<br><br>代码(写的比较繁琐):<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;Diff(a,&nbsp;b)&nbsp;((a)&gt;(b)&nbsp;?&nbsp;((a)-(b))&nbsp;:&nbsp;((b)-(a)))</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;Max(a,&nbsp;b)&nbsp;((a)&gt;(b)&nbsp;?&nbsp;(a)&nbsp;:&nbsp;(b))</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;3</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">typedef&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Black,<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;White<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">}Color;<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">is_linear(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">src,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dst)<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(src[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]</span><span style="color: #000000; ">==</span><span style="color: #000000; ">dst[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;src[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">==</span><span style="color: #000000; ">dst[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">is_oblique(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">src,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dst)<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x_diff&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Diff(src[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],&nbsp;dst[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;y_diff&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Diff(src[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],&nbsp;dst[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(x_diff&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;y_diff)<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">Color<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">black_or_white(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">src)<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;src[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;src[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(x</span><span style="color: #000000; ">%</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;y</span><span style="color: #000000; ">%</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;White;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;Black;<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">solve(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">src,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dst)<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;x_diff,&nbsp;y_diff;<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;x_diff&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Diff(src[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],&nbsp;dst[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;y_diff&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Diff(src[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],&nbsp;dst[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Max(x_diff,&nbsp;y_diff);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;king&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(is_linear(src,&nbsp;dst)&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;is_oblique(src,&nbsp;dst))&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;queen&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(is_linear(src,&nbsp;dst))&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;rook&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(is_oblique(src,&nbsp;dst))&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;bishop&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(black_or_white(src)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;black_or_white(dst))<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d&nbsp;%d&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;c);<br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(d&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Inf\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;d);<br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tests;<br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;begin[MAX_LEN],&nbsp;end[MAX_LEN];<br></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tests);<br></span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(tests</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;begin,&nbsp;end);<br></span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(begin[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]</span><span style="color: #000000; ">==</span><span style="color: #000000; ">end[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;begin[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">==</span><span style="color: #000000; ">end[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br></span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">0&nbsp;0&nbsp;0&nbsp;0\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve(begin,&nbsp;end);<br></span><span style="color: #008080; ">83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">84</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/131688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-29 01:31 <a href="http://www.cppblog.com/Joe/archive/2010/10/29/131688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单、高效、直观</title><link>http://www.cppblog.com/Joe/archive/2010/10/26/131399.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 26 Oct 2010 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/26/131399.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/131399.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/26/131399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/131399.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/131399.html</trackback:ping><description><![CDATA[<div>在图书馆偶见《系统程序员成长计划》，作者是李先静<br>记得之前曾经见过作者的博客，可惜没能仔细查看<br>如今，赶紧借了回来，刚看了前几章，觉得写的很好，也颇有收获(其实，Linux+Vim+C特别符合咱胃口(*^__^*) 嘻嘻&#8230;&#8230;）<br><br>书中描述C语言的特点：简单、高效、直观，实在是言简意赅<br>说实话，我最喜欢的就是C语言<br><br>Keep Fighting...</div><img src ="http://www.cppblog.com/Joe/aggbug/131399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-26 21:39 <a href="http://www.cppblog.com/Joe/archive/2010/10/26/131399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 3561   Pseudographical recognizer</title><link>http://www.cppblog.com/Joe/archive/2010/10/22/130926.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Fri, 22 Oct 2010 13:23:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/22/130926.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130926.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/22/130926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130926.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=3561">http://poj.org/problem?id=3561</a><br><br>思路:<br>简单题，结果却WA了一次<br>注意题目中给出的定义:&nbsp;<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: 'Times New Roman', Times, serif; font-size: 16px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">in adjacent cells</span><br>就是说，这些符号必须是连续的，否则就要算两个<br>另一点就是符号'\'需要写成'\\'，开始编译错误了呵呵<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;101</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;is_valid(x,&nbsp;y)&nbsp;((x)&gt;=0&nbsp;&amp;&amp;&nbsp;(x)&lt;N&nbsp;&amp;&amp;&nbsp;(y)&gt;=0&nbsp;&amp;&amp;&nbsp;(y)&lt;M)</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N,&nbsp;M;<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;image[MAX_LEN][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;visited[MAX_LEN][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;hor,&nbsp;vert,&nbsp;diag;<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">mark(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dx,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dy,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;ch)<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(is_valid(i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dx,&nbsp;j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dy)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;image[i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dx][j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dy]</span><span style="color: #000000; ">==</span><span style="color: #000000; ">ch)&nbsp;{<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visited[i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dx][j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dy]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;dx;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;dy;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;ch;<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">M;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;image[i][j];<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ch</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">.</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">visited[i][j])&nbsp;{<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visited[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(ch)&nbsp;{<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">hor;<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">|</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">vert;<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">diag;<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">/</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">diag;<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark(i,&nbsp;j,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ch);<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;tests;<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tests);<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(tests</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">N,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">M);<br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;image[i]);<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visited,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(visited));<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vert&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;diag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(hor</span><span style="color: #000000; ">+</span><span style="color: #000000; ">vert</span><span style="color: #000000; ">+</span><span style="color: #000000; ">diag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CORRECT\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">INCORRECT\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-22 21:23 <a href="http://www.cppblog.com/Joe/archive/2010/10/22/130926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   最小路径覆盖</title><link>http://www.cppblog.com/Joe/archive/2010/10/21/130676.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Wed, 20 Oct 2010 16:14:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/21/130676.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130676.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/21/130676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130676.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130676.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="color: rgb(51, 51, 51); font-family: Arial; font-size: 12px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; ">在一个ＰＸＰ的有向图中，</font><font face="楷体_GB2312" color="#333333" size="4" style="line-height: normal; ">路径覆盖</font><font face="楷体_GB2312" color="#000000" size="4" style="line-height: normal; ">就是在图中找一些路经，使之覆盖了图中的所有顶点，且任何一个顶点有且只有一条路径与之关联；（如果把这些路径中的每条路径从它的起始点走到它的终点，那么恰好可以经过图中的每个顶点一次且仅一次）；如果不考虑图中存在回路，那么每每条路径就是一个弱连通子集．</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; ">由上面可以得出：</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; ">１.一个单独的顶点是一条路径；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; ">２．如果存在一路径p1,p2,......pk，其中p1 为起点，pk为终点，那么在覆盖图中，顶点p1,p2,......pk不再与其它的顶点之间存在有向边．</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" color="#333333" size="4" style="line-height: normal; ">最小路径覆盖</font><font face="楷体_GB2312" size="4" style="line-height: normal; ">就是找出最小的路径条数，使之成为Ｐ的一个路径覆盖．</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; ">路径覆盖与二分图匹配的关系：</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" size="4" style="line-height: normal; "><font color="#333333" style="line-height: normal; ">最小路径覆盖＝｜Ｐ｜－最大匹配数；</font></font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font face="楷体_GB2312" color="#333333" size="4" style="line-height: normal; ">其中最大匹配数的求法是把Ｐ中的每个顶点pi分成两个顶点pi'与pi''，如果在p中存在一条pi到pj的边，那么在二分图Ｐ＇中就有一条连接pi'与pj''的无向边；这里pi' 就是p中pi的出边，pj''就是p中pj 的一条入边；</font></p><font face="楷体_GB2312" size="4" style="line-height: normal; "><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">对于公式：<font color="#ff0000" style="line-height: normal; ">最小路径覆盖＝｜Ｐ｜－最大匹配数</font>；可以这么来理解；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">如果匹配数为零，那么Ｐ中不存在有向边，于是显然有：</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">最小路径覆盖＝｜Ｐ｜－最大匹配数＝｜Ｐ｜－０＝｜Ｐ｜；即Ｐ的最小路径覆盖数为｜Ｐ｜；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">Ｐ＇中不在于匹配边时，路径覆盖数为｜Ｐ｜；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">如果在Ｐ＇中增加一条匹配边pi'－－＞pj''，那么在图P的路径覆盖中就存在一条由pi连接pj的边，也就是说pi与pj 在一条路径上，于是路径覆盖数就可以减少一个；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">如此继续增加匹配边，每增加一条，路径覆盖数就减少一条；直到匹配边不能继续增加时，路径覆盖数也不能再减少了，此时就有了前面的公式；但是这里只 是说话了每条匹配边对应于路径覆盖中的一条路径上的一条连接两个点之间的有向边；下面来说明一个路径覆盖中的每条连接两个顶点之间的有向边对应于一条匹配 边；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">与前面类似，对于路径覆盖中的每条连接两个顶点之间的每条有向边pi---&gt;pj，我们可以在匹配图中对应做一条连接pi'与pj''的边， 显然这样做出来图的是一个匹配图（这一点用反证法很容易证明，如果得到的图不是一个匹配图，那么这个图中必定存在这样两条边&nbsp;&nbsp;</font><font color="#333333" style="line-height: normal; ">pi'---pj'' 及 pi' ----pk''，（j!=k），那么在路径覆盖图中就存在了两条</font><font color="#333333" style="line-height: normal; ">边pi--&gt;pj, pi---&gt;pk ，那边从pi出发的路径就不止一条了，这与路径覆盖图是矛盾的；还有另外一种情况就是存在pi'---pj'',pk'---pj''，这种情况也类似可证）；</font></p><p style="line-height: normal; color: rgb(51, 51, 51); font-size: 12px !important; "><font color="#333333" style="line-height: normal; ">至此，就说明了匹配边与路径覆盖图中连接两顶点之间边的一一对应关系，那么也就说明了前面的公式成立！</font></p></font></span>
<img src ="http://www.cppblog.com/Joe/aggbug/130676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-21 00:14 <a href="http://www.cppblog.com/Joe/archive/2010/10/21/130676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   二分图匹配的匈牙利算法</title><link>http://www.cppblog.com/Joe/archive/2010/10/20/130573.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Wed, 20 Oct 2010 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/20/130573.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130573.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/20/130573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130573.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130573.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: Arial; font-size: 12px; line-height: 18px; "><table style="line-height: 20px !important; table-layout: fixed; width: 870px; "><tbody style="line-height: 20px !important; "><tr style="line-height: 20px !important; "><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px !important; "><div id="blog_text" class="cnt" style="font-family: Arial; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px; color: rgb(95, 95, 95); overflow-x: hidden; overflow-y: hidden; position: static; "><p style="line-height: normal; "></p><p style="line-height: normal; "></p>二分图指的是这样一种图：其所有的顶点分成两个集合M和N，其中M或N中任意两个在同一集合中的点都不相连。二分图匹配是指求出一组边，其中的顶点分别在两个集合中，并且任意两条边都没有相同的顶点，这组边叫做二分图的匹配，而所能得到的最大的边的个数，叫做最大匹配。<p style="line-height: normal; "></p><p style="line-height: normal; "><font face="Arial" style="line-height: normal; "><strong style="line-height: normal; "><font style="line-height: normal; background-color: rgb(255, 255, 102); ">匈牙利算法</font></strong>。这个算法说白了就是最大流的算法，但是它跟据二分图匹配这个问题的特点，把最大流算法做了简化，提高了效率。<strong style="line-height: normal; color: black; background-color: rgb(255, 255, 102); ">匈牙利算法</strong>其实很简单，但是网上搜不到什么说得清楚的文章。所以我决定要写一下。<br style="line-height: normal; ">最大流算法的核心问题就是找增广路径（augment path）。<strong style="line-height: normal; color: black; background-color: rgb(255, 255, 102); ">匈牙利算法</strong>也不例外，它的基本模式就是：<br style="line-height: normal; "><br style="line-height: normal; "></font><table class="FCK__ShowTableBorders" cellspacing="0" cellpadding="0" width="100%" border="0" style="line-height: normal; table-layout: auto; "><tbody style="line-height: normal; "><tr style="line-height: normal; "><td bgcolor="#ffffff" style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><font face="Courier New" style="line-height: normal; ">初始时最大匹配为空<br style="line-height: normal; ">while 找得到增广路径<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; do 把增广路径加入到最大匹配中去</font></td></tr></tbody></table></p><p align="left" style="line-height: normal; "><font face="Arial" style="line-height: normal; ">可见和最大流算法是一样的。但是这里的增广路径就有它一定的特殊性，下面我来分析一下。<br style="line-height: normal; ">（注：<strong style="line-height: normal; color: black; background-color: rgb(255, 255, 102); ">匈牙利算法</strong>虽然根本上是最大流算法，但是它不需要建网络模型，所以图中不再需要源点和汇点，仅仅是一个二分图。每条边也不需要有方向。）<br style="line-height: normal; "><br style="line-height: normal; "></font></p><p align="center" style="line-height: normal; "><img src="http://foto.yculblog.com/photo/i/imlazy/06100501.jpg" border="0" style="line-height: normal; ">图1&nbsp;<img src="http://foto.yculblog.com/photo/i/imlazy/06100502.jpg" border="0" style="line-height: normal; ">图2</p><p align="left" style="line-height: normal; "><br style="line-height: normal; "><font face="Arial" style="line-height: normal; ">图1是我给出的二分图中的一个匹配：〔1，5〕和〔2，6〕。图2就是在这个匹配的基础上找到的一条增广路径：<font face="Arial" style="line-height: normal; ">3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4。</font></font><font face="Arial" style="line-height: normal; ">我们借由它来描述一下二分图中的增广路径的性质：<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">(1)有奇数条边。<br style="line-height: normal; ">(2)起点在二分图的左半边，终点在右半边。<br style="line-height: normal; ">(3)路径上的点一定是一个在左半边，一个在右半边，交替出现。（其实二分图的性质就决定了这一点，因为二分图同一边的点之间没有边相连，不要忘记哦。）<br style="line-height: normal; ">(4)整条路径上没有重复的点。<br style="line-height: normal; ">(5)起点和终点都是目前还没有配对的点，而其它所有点都是已经配好对的。（如图1、图2所示，〔1，5〕和〔2，6〕在图1中是两对已经配好对的点；而起点3和终点4目前还没有与其它点配对。）<br style="line-height: normal; ">(6)路径上的所有第奇数条边都不在原匹配中，所有第偶数条边都出现在原匹配中。（如图1、图2所示，原有的匹配是〔1，5〕和〔2，6〕，这两条配匹的边在图2给出的增广路径中分边是第2和第4条边。而增广路径的第1、3、5条边都没有出现在图1给出的匹配中。）<br style="line-height: normal; ">(7)最后，也是最重要的一条，把增广路径上的所有第奇数条边加入到原匹配中去，并把增广路径中的所有第偶数条边从原匹配中删除（这个操作称为增广路径的<strong style="line-height: normal; ">取反</strong>），则新的匹配数就比原匹配数增加了1个。（如图2所示，新的匹配就是所有蓝色的边，而所有红色的边则从原匹配中删除。则新的匹配数为3。）<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">不难想通，在最初始时，还没有任何匹配时，图1中的两条灰色的边本身也是增广路径。因此在这张二分图中寻找最大配匹的过程可能如下：<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">(1)找到增广路径1-&gt;5，把它取反，则匹配数增加到1。<br style="line-height: normal; ">(2)找到增广路径2-&gt;6，把它取反，则匹配数增加到2。<br style="line-height: normal; ">(3)找到增广路径3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4，把它取反，则匹配数增加到3。<br style="line-height: normal; ">(4)再也找不到增广路径，结束。<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">当然，这只是一种可能的流程。也可能有别的找增广路径的顺序，或者找到不同的增广路径，最终的匹配方案也可能不一样。但是最大匹配数一定都是相同的。<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">对于增广路径还可以用一个递归的方法来描述。这个描述不一定最准确，但是它揭示了寻找增广路径的一般方法：<br style="line-height: normal; ">&#8220;从点A出发的增广路径&#8221;一定首先连向一个在原匹配中没有与点A配对的点B。如果点B在原匹配中没有与任何点配对，则它就是这条增广路径的终点；反之，如果点B已与点C配对，那么这条增广路径就是从A到B，再从B到C，再加上&#8220;从点C出发的增广路径&#8221;。并且，这条从C出发的增广路径中不能与前半部分的增广路径有重复的点。<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">比如图2中，我们要寻找一条从3出发的增广路径，要做以下3步：<br style="line-height: normal; ">(1)首先从3出发，它能连到的点只有6，而6在图1中已经与2配对，所以目前的增广路径就是3-&gt;6-&gt;2再加上从2出发的增广路径。<br style="line-height: normal; ">(2)从2出发，它能连到的不与前半部分路径重复的点只有5，而且5确实在原匹配中没有与2配对。所以从2连到5。但5在图1中已经与1配对，所以目前的增广路径为3-&gt;6-&gt;2-&gt;5-&gt;1再加上从1出发的增广路径。<br style="line-height: normal; ">(3)从1出发，能连到的不与自已配对并且不与前半部分路径重复的点只有4。因为4在图1中没有与任何点配对，所以它就是终点。所以最终的增广路径是3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4。<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">但是严格地说，以上过程中从2出发的增广路径（2-&gt;5-&gt;1-&gt;4）和从1出发的增广路径（1-&gt;4）并不是真正的增广路径。因为它们不符合前面讲过的增广路径的第5条性质，它们的起点都是已经配过对的点。我们在这里称它们为&#8220;增广路径&#8221;只是为了方便说明整个搜寻的过程。而这两条路径本身只能算是两个不为外界所知的子过程的返回结果。<br style="line-height: normal; ">显然，从上面的例子可以看出，搜寻增广路径的方法就是DFS，可以写成一个递归函数。当然，用BFS也完全可以实现。<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">至此，理论基础部份讲完了。但是要完成<strong style="line-height: normal; color: black; background-color: rgb(255, 255, 102); ">匈牙利算法</strong>，还需要一个重要的定理：<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; "><br style="line-height: normal; ">如果从一个点A出发，没有找到增广路径，那么无论再从别的点出发找到多少增广路径来改变现在的匹配，从A出发都永远找不到增广路径。<br style="line-height: normal; "><br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; ">要用文字来证明这个定理很繁，话很难说，要么我还得多画一张图，我在此就省了。其实你自己画几个图，试图举两个反例，这个定理不难想通的。（给个提示。如果你试图举个反例来说明在找到了别的增广路径并改变了现有的匹配后，从A出发就能找到增广路径。那么，在这种情况下，肯定在找到别的增广路径之前，就能从A出发找到增广路径。这就与假设矛盾了。）<br style="line-height: normal; "></font><font face="Arial" style="line-height: normal; ">有了这个定理，<strong style="line-height: normal; color: black; background-color: rgb(255, 255, 102); ">匈牙利算法</strong>就成形了。如下：</font></p><p align="left" style="line-height: normal; "><table class="FCK__ShowTableBorders" cellspacing="0" cellpadding="0" width="100%" border="0" style="line-height: normal; table-layout: auto; "><tbody style="line-height: normal; "><tr style="line-height: normal; "><td bgcolor="#ffffff" style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><font face="Courier New" style="line-height: normal; ">初始时最大匹配为空<br style="line-height: normal; ">for 二分图左半边的每个点i<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; do 从点i出发寻找增广路径。如果找到，则把它取反（即增加了总了匹配数）。</font></td></tr></tbody></table></p><p style="line-height: normal; "><font face="Arial" style="line-height: normal; ">如果二分图的左半边一共有n个点，那么最多找n条增广路径。如果图中共有m条边，那么每找一条增广路径（DFS或BFS）时最多把所有边遍历一遍，所花时间也就是m。所以总的时间大概就是O（n * m）。</font></p></div></td></tr></tbody></table></span>
<img src ="http://www.cppblog.com/Joe/aggbug/130573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-20 15:13 <a href="http://www.cppblog.com/Joe/archive/2010/10/20/130573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 2005   Blackjack</title><link>http://www.cppblog.com/Joe/archive/2010/10/19/130496.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 19 Oct 2010 13:30:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/19/130496.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130496.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/19/130496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130496.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=2005">http://poj.org/problem?id=2005</a><br><br>思路:<br>简单题，但是容易错<br>特殊情况: 两张牌都是Ace，这也是Ace需要被当作是1的唯一情况<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;player,&nbsp;dealer;<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;count[</span><span style="color: #000000; ">14</span><span style="color: #000000; ">];<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;card[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">][</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">score(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;ch)<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ch&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">A</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">11</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ch&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">T</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;ch</span><span style="color: #000000; ">==</span><span style="color: #000000; ">'</span><span style="color: #000000; ">J</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;ch</span><span style="color: #000000; ">==</span><span style="color: #000000; ">'</span><span style="color: #000000; ">Q</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;ch</span><span style="color: #000000; ">==</span><span style="color: #000000; ">'</span><span style="color: #000000; ">K</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ch</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;tmp,&nbsp;total;<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">n)</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">EOF&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;n)&nbsp;{<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;player&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dealer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;memset(count,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(count));<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;card[i]);<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;score(card[i][</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">count[tmp];<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dealer&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;tmp;<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;player&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;tmp;<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(player&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">22</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;two&nbsp;Ace&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;player&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">12</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">11</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((dealer</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i</span><span style="color: #000000; ">==</span><span style="color: #000000; ">22</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">12</span><span style="color: #000000; ">&nbsp;:&nbsp;dealer</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i)&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;player)&nbsp;{<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">*</span><span style="color: #000000; ">4</span><span style="color: #000000; ">*</span><span style="color: #000000; ">n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">count[i]);<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">*</span><span style="color: #000000; ">n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">count[i]);<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%.3f%%\n\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;((</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">)total)</span><span style="color: #000000; ">/</span><span style="color: #000000; ">(</span><span style="color: #000000; ">52</span><span style="color: #000000; ">*</span><span style="color: #000000; ">n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-19 21:30 <a href="http://www.cppblog.com/Joe/archive/2010/10/19/130496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 3090   Visible Lattice Points</title><link>http://www.cppblog.com/Joe/archive/2010/10/18/130321.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Mon, 18 Oct 2010 12:18:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/18/130321.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130321.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/18/130321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130321.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=3090">http://poj.org/problem?id=3090</a><br><br>思路:<br>首先可以观察得到这样的点集是对称的，只需要求一半即可<br>这里，我采用了模拟的方法，直接去掉挡住的点<br>结果TLE，然后发现可以打表，随即AC，打表真是强大啊呵呵...<br>ps.<br>据说这题与什么欧拉函数有关系，没有深究<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;1001</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N,&nbsp;points[MAX_LEN][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;result[MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Attention:&nbsp;symmetrical&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j,&nbsp;k,&nbsp;count&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(points,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(points));<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_LEN;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">i;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">points[i][j])<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">count;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(k</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">*</span><span style="color: #000000; ">k</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_LEN</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">j</span><span style="color: #000000; ">*</span><span style="color: #000000; ">k</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_LEN;&nbsp;k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;points[i</span><span style="color: #000000; ">*</span><span style="color: #000000; ">k][j</span><span style="color: #000000; ">*</span><span style="color: #000000; ">k]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;count;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;tests;<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tests);<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">tests;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">N);<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;i,&nbsp;N,&nbsp;((result[N]</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">));<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-18 20:18 <a href="http://www.cppblog.com/Joe/archive/2010/10/18/130321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1147   Binary codes</title><link>http://www.cppblog.com/Joe/archive/2010/10/18/130306.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Mon, 18 Oct 2010 10:25:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/18/130306.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130306.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/18/130306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130306.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=1147">http://poj.org/problem?id=1147</a><br><br>思路:<br>这题太精妙了...<br>恐怕是到目前为止，最为精妙的了...<br>翻了很多网上资料，才想明白，艾，推理能力太差...<br><br>关键点:<br>1. 对于排序后的矩阵，每一行都可以通过第一行旋转得到<br>2.&nbsp;假设矩阵中两行都以0开始，则它们左旋后，前后次序不变，所以在矩阵中以0开始的第1行，它的左旋后的序列在最后一列的第一个0的行。对1 &nbsp; &nbsp; &nbsp; 开始的行有同样的性质<br>3. 通过1、2两点即可确定next数组，即第一列与最后一列的对应关系<br>4. 观察题目给出的Figure 1，可以看出第一列与最后一列之间的巧妙关系: b2可以通过找到第一列b1所对应的最后一列的所在行而得到<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;3001</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;first_col[MAX_LEN],&nbsp;last_col[MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N,&nbsp;zeros,&nbsp;ones,&nbsp;next[MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;count;<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">N)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zeros&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ones&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;last_col</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i);<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last_col[i]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first_col[</span><span style="color: #000000; ">++</span><span style="color: #000000; ">zeros]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">ones;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">ones;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first_col[zeros</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ones&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;zeros</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zeros&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last_col[i]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next[zeros</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next[ones</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(count</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;count</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">next[i],&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">count)<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;first_col[i]);<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-18 18:25 <a href="http://www.cppblog.com/Joe/archive/2010/10/18/130306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 3508   Hide That Number</title><link>http://www.cppblog.com/Joe/archive/2010/10/17/130209.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 17 Oct 2010 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/17/130209.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130209.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/17/130209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130209.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=3508">http://poj.org/problem?id=3508</a><br><br>思路:<br>挺简单的算数题(注意进位)，简化为:<br>&nbsp;&nbsp; &nbsp; &nbsp;abc<br>&nbsp;&nbsp; &nbsp;+ &nbsp;abc<br>&nbsp;&nbsp; &nbsp;---------<br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 353<br>第一次提交居然TLE，汗...<br>然后把memset(result, 0, sizeof(result))的代码删掉，再适当减少些运算，就AC了，860MS<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;860MS&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;1000003</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;num[MAX_LEN],&nbsp;result[MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len;<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;mark,&nbsp;minus,&nbsp;tmp;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;minus&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mark&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">len</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minus&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;mark;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(minus&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;(num[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">))&nbsp;{<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;num[i]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;minus;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;num[i]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;minus;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minus&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;result[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;result[len]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(result[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">IMPOSSIBLE\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;result);<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tests&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;num)</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">EOF&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;num[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strlen(num);<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d.&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">tests);<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-17 20:45 <a href="http://www.cppblog.com/Joe/archive/2010/10/17/130209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线性筛法求质数(素数)表</title><link>http://www.cppblog.com/Joe/archive/2010/10/17/130204.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 17 Oct 2010 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/17/130204.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130204.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/17/130204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130204.html</trackback:ping><description><![CDATA[参考:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://www.cnblogs.com/coeus/articles/1541722.html">http://www.cnblogs.com/coeus/articles/1541722.html</a><br><br>原理:<br>1. 任何一个合数都可以表示成一个质数和一个数的乘积<br>2. 假设A是一个合数，且A = x * y，这里x也是一个合数，那么有:<br>&nbsp;&nbsp; &nbsp; &nbsp; A = x * y; (假设y质数，x合数)<br>&nbsp;&nbsp; &nbsp; &nbsp; x = a * b; (假设a是质数，且a &lt; x)<br>&nbsp;-&gt; &nbsp;A = a * b * y = a * Z (Z = b * y)<br>即一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积<br>这也是理解代码中 if(i%primes[j] == 0)break;的关键<br>例如: 如果i = 8; 那么由于i%2 == 0; 因此对于i=8就只需要检查primes[1]即可，因为对于大于primes[1]的质数，像3，有:<br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;8*3 = 2*4*3 = 12*2<br>也就是说24(8*3=24)并不需要在8时检查，在12时才检查&nbsp;<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Problem:<br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;given&nbsp;an&nbsp;upper&nbsp;bound&nbsp;like&nbsp;U(integer),&nbsp;print&nbsp;all&nbsp;the&nbsp;primes&nbsp;between&nbsp;0-U<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Points:<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;this's&nbsp;a&nbsp;O(n)&nbsp;algorithm,&nbsp;amazing<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_N&nbsp;250000</span><span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N,&nbsp;hash[MAX_N];<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pcount,&nbsp;primes[MAX_N];<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">linear_selection()<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;primes[pcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">hash[i])<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primes[pcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pcount&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">*</span><span style="color: #000000; ">primes[j]</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[i</span><span style="color: #000000; ">*</span><span style="color: #000000; ">primes[j]]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">%</span><span style="color: #000000; ">primes[j]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Enter&nbsp;the&nbsp;upper&nbsp;boundary:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">N);<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">N)<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(hash,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(hash));<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linear_selection();<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pcount;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;primes[i]);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-17 18:19 <a href="http://www.cppblog.com/Joe/archive/2010/10/17/130204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1573   Robot Motion</title><link>http://www.cppblog.com/Joe/archive/2010/10/17/130192.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 17 Oct 2010 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/17/130192.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/130192.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/17/130192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/130192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/130192.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://poj.org/problem?id=1573">http://poj.org/problem?id=1573</a><br><br>思路:<br>简单题，纯模拟...<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;12</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;is_valid(x,&nbsp;y)&nbsp;(x&gt;=0&nbsp;&amp;&amp;&nbsp;x&lt;R&nbsp;&amp;&amp;&nbsp;y&gt;=0&nbsp;&amp;&amp;&nbsp;y&lt;C)</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;map[MAX_LEN][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;steps[MAX_LEN][MAX_LEN];<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;R,&nbsp;C,&nbsp;entry;<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;ch;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cx,&nbsp;cy,&nbsp;px,&nbsp;py;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;px&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;py&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;entry</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(is_valid(cx,&nbsp;cy)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">steps[cx][cy])&nbsp;{<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;steps[cx][cy]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;steps[px][py]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;map[cx][cy];<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;px&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cx;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;py&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cy;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(ch)&nbsp;{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">N</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;px</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;py;<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">S</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;px</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;py;<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">W</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;px;<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;py</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">E</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;px;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;py</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">is_valid(cx,&nbsp;cy))<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;step(s)&nbsp;to&nbsp;exit\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;steps[px][py]);<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(steps[cx][cy])<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;step(s)&nbsp;before&nbsp;a&nbsp;loop&nbsp;of&nbsp;%d&nbsp;step(s)\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;steps[cx][cy]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;steps[px][py]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">steps[cx][cy]</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">R,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">C,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">entry)</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">EOF&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;R)&nbsp;{<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">R;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;map[i]);<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(steps,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(steps));<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/130192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-17 11:12 <a href="http://www.cppblog.com/Joe/archive/2010/10/17/130192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   USACO Search Techniques</title><link>http://www.cppblog.com/Joe/archive/2010/10/10/129317.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 10 Oct 2010 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/10/129317.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/129317.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/10/129317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/129317.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/129317.html</trackback:ping><description><![CDATA[出处:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://ace.delos.com/usacotext2?a=4odBE1tA7sS&amp;S=rec">http://ace.delos.com/usacotext2?a=4odBE1tA7sS&amp;S=rec</a><br><br><meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: Verdana, Tahoma, sans-serif, Arial, 'Lucida Sans', 'Gill Sans'; "><h4>Sample Problem:&nbsp;<em>n</em>&nbsp;Queens [Traditional]</h4><p>Place&nbsp;<em>n</em>&nbsp;queens on an&nbsp;<em>n x n</em>&nbsp;chess board so that no queen is attacked by another queen.</p><h4>Depth First Search (DFS)</h4><p>The most obvious solution to code is to add queens recursively to the board one by one, trying all possible queen placements. It is easy to exploit the fact that there must be exactly one queen in each column: at each step in the recursion, just choose where in the current column to put the queen.&nbsp;<br><tt><font size="2"><br>&nbsp;1&nbsp;search(col)<br>&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;filled&nbsp;all&nbsp;columns<br>&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;solution&nbsp;and&nbsp;exit&nbsp;<br><br>&nbsp;4&nbsp;&nbsp;&nbsp;for&nbsp;each&nbsp;row<br>&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;board(row,&nbsp;col)&nbsp;is&nbsp;not&nbsp;attacked<br>&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;queen&nbsp;at&nbsp;(row,&nbsp;col)<br>&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(col+1)<br>&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove&nbsp;queen&nbsp;at&nbsp;(row,&nbsp;col)<br></font></tt></p><p>Calling&nbsp;<tt><font size="2">search(0)</font></tt>&nbsp;begins the search. This runs quickly, since there are relatively few choices at each step: once a few queens are on the board, the number of non-attacked squares goes down dramatically.</p><p>This is an example of&nbsp;<em>depth first search</em>, because the algorithm iterates down to the bottom of the search tree as quickly as possible: once&nbsp;<em>k</em>&nbsp;queens are placed on the board, boards with even more queens are examined before examining other possible boards with only&nbsp;<em>k</em>&nbsp;queens. This is okay but sometimes it is desirable to find the simplest solutions before trying more complex ones.</p><p>Depth first search checks each node in a search tree for some property. The search tree might look like this:&nbsp;<br><img src="http://ace.delos.com/usaco/TEXT/rec.tree1.gif"><br>The algorithm searches the tree by going down as far as possible and then backtracking when necessary, making a sort of outline of the tree as the nodes are visited. Pictorially, the tree is traversed in the following manner:&nbsp;<br><img src="http://ace.delos.com/usaco/TEXT/rec2.gif"><br></p><h5>Complexity</h5><p>Suppose there are&nbsp;<em>d</em>&nbsp;decisions that must be made. (In this case&nbsp;<em>d=n</em>, the number of columns we must fill.) Suppose further that there are C choices for each decision. (In this case&nbsp;<em>c=n</em>&nbsp;also, since any of the rows could potentially be chosen.) Then the entire search will take time proportional to&nbsp;<em>c<sup>d</sup></em>, i.e., an exponential amount of time. This scheme requires little space, though: since it only keeps track of as many decisions as there are to make, it requires only O(<em>d</em>) space.</p><h4>Sample Problem: Knight Cover [Traditional]</h4><p>Place as few knights as possible on an&nbsp;<em>n x n</em>&nbsp;chess board so that every square is attacked. A knight is not considered to attack the square on which it sits.</p><h5>Breadth First Search (BFS)</h5><p>In this case, it is desirable to try all the solutions with only&nbsp;<em>k</em>&nbsp;knights before moving on to those with&nbsp;<em>k+1</em>&nbsp;knights. This is called&nbsp;<strong>breadth first search</strong>. The usual way to implement breadth first search is to use a queue of states:&nbsp;<br><tt><font size="2"><br>&nbsp;1&nbsp;process(state)<br>&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;each&nbsp;possible&nbsp;next&nbsp;state&nbsp;from&nbsp;this&nbsp;one<br>&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enqueue&nbsp;next&nbsp;state&nbsp;<br><br>&nbsp;4&nbsp;search()<br>&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enqueue&nbsp;initial&nbsp;state<br>&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;!empty(queue)<br>&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;=&nbsp;get&nbsp;state&nbsp;from&nbsp;queue<br>&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(state)<br></font></tt></p><p>This is called breadth first search because it searches an entire row (the breadth) of the search tree before moving on to the next row. For the search tree used previously, breadth first search visits the nodes in this order:&nbsp;<br><img src="http://ace.delos.com/usaco/TEXT/rec3.gif"><br>It first visits the top node, then all the nodes at level 1, then all at level 2, and so on.</p><h5>Complexity</h5><p>Whereas depth first search required space proportional to the number of decisions (there were&nbsp;<em>n</em>&nbsp;columns to fill in the&nbsp;<em>n</em>&nbsp;queens problem, so it took O(<em>n</em>) space), breadth first search requires space exponential in the number of choices.</p><p>If there are&nbsp;<em>c</em>&nbsp;choices at each decision and&nbsp;<em>k</em>&nbsp;decisions have been made, then there are&nbsp;<em>c<sup>k</sup></em>&nbsp;possible boards that will be in the queue for the next round. This difference is quite significant given the space restrictions of some programming environments.</p><p>[Some details on why&nbsp;<em>c<sup>k</sup>: Consider the nodes in the recursion tree. The zeroeth level has 1 nodes. The first level has c nodes. The second level has c<sup>2</sup>&nbsp;nodes, etc. Thus, the total number of nodes on the k-th level is c<sup>k</sup></em>.]</p><h5>Depth First with Iterative Deepening (ID)</h5><p>An alternative to breadth first search is&nbsp;<em>iterative deepening</em>. Instead of a single breadth first search, run D depth first searches in succession, each search allowed to go one row deeper than the previous one. That is, the first search is allowed only to explore to row 1, the second to row 2, and so on. This ``simulates'' a breadth first search at a cost in time but a savings in space.&nbsp;<br><tt><font size="2"><br>&nbsp;1&nbsp;truncated_dfsearch(hnextpos,&nbsp;depth)<br>&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;board&nbsp;is&nbsp;covered<br>&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;solution&nbsp;and&nbsp;exit&nbsp;<br><br>&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;depth&nbsp;==&nbsp;0<br>&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;<br><br>&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;from&nbsp;nextpos&nbsp;to&nbsp;n*n<br>&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;put&nbsp;knight&nbsp;at&nbsp;i<br>&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;truncated_dfsearch(i+1,&nbsp;depth-1)<br>&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove&nbsp;knight&nbsp;at&nbsp;i&nbsp;<br><br>10&nbsp;dfid_search<br>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;depth&nbsp;=&nbsp;0&nbsp;to&nbsp;max_depth<br>12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;truncated_dfsearch(0,&nbsp;depth)<br></font></tt></p><h5>Complexity</h5><p>The space complexity of iterative deepening is just the space complexity of depth first search: O(<em>n</em>). The time complexity, on the other hand, is more complex. Each truncated depth first search stopped at depth&nbsp;<em>k</em>&nbsp;takes&nbsp;<em>c<sup>k</sup></em>&nbsp;time. Then if&nbsp;<em>d</em>&nbsp;is the maximum number of decisions, depth first iterative deepening takes&nbsp;<em>c<sup>0</sup>&nbsp;+ c<sup>1</sup>&nbsp;+ c<sup>2</sup>&nbsp;+ ... + c<sup>d</sup></em>&nbsp;time.</p><p>If&nbsp;<em>c = 2</em>, then this sum is&nbsp;<em>c<sup>d+1</sup>&nbsp;- 1</em>, about twice the time that breadth first search would have taken. When&nbsp;<em>c</em>&nbsp;is more than two (i.e., when there are many choices for each decision), the sum is even less: iterative deepening cannot take more than twice the time that breadth first search would have taken, assuming there are always at least two choices for each decision.</p><h4>Which to Use?</h4><p>Once you've identified a problem as a search problem, it's important to choose the right type of search. Here are some things to think about.</p><h5>In a Nutshell</h5><center><table><tbody><tr><td>Search</td><td>Time</td><td>Space</td><td>When to use</td></tr><tr><td>DFS</td><td>O(<em>c<sup>k</sup></em>)</td><td>O(<em>k</em>)</td><td>Must search tree anyway, know the level the answers are on, or you aren't looking for the shallowest number.</td></tr><tr><td>BFS</td><td>O(<em>c<sup>d</sup></em>)</td><td>O(<em>c<sup>d</sup></em>)</td><td>Know answers are very near top of tree, or want shallowest answer.</td></tr><tr><td>DFS+ID</td><td>O(<em>c<sup>d</sup></em>)</td><td>O(<em>d</em>)</td><td>Want to do BFS, don't have enough space, and can spare the time.</td></tr></tbody></table></center><em>d</em>&nbsp;is the depth of the answer&nbsp;<br><em>k</em>&nbsp;is the depth searched&nbsp;<br><em>d &lt;= k</em><p>Remember the ordering properties of each search. If the program needs to produce a list sorted shortest solution first (in terms of distance from the root node), use breadth first search or iterative deepening. For other orders, depth first search is the right strategy.</p><p>If there isn't enough time to search the entire tree, use the algorithm that is more likely to find the answer. If the answer is expected to be in one of the rows of nodes closest to the root, use breadth first search or iterative deepening. Conversely, if the answer is expected to be in the leaves, use the simpler depth first search.</p><p>Be sure to keep space constraints in mind. If memory is insufficient to maintain the queue for breadth first search but time is available, use iterative deepening.</p><h4>Sample Problems</h4><h5>Superprime Rib [USACO 1994 Final Round, adapted]</h5><p>A number is called superprime if it is prime and every number obtained by chopping some number of digits from the right side of the decimal expansion is prime. For example, 233 is a superprime, because 233, 23, and 2 are all prime. Print a list of all the superprime numbers of length&nbsp;<em>n</em>, for&nbsp;<em>n &lt;= 9</em>. The number 1 is not a prime.</p><p>For this problem, use depth first search, since all the answers are going to be at the&nbsp;<em>n</em>th level (the bottom level) of the search.</p><h5>Betsy's Tour [USACO 1995 Qualifying Round]</h5><p>A square township has been partitioned into&nbsp;<em>n&nbsp;<sup>2</sup></em>&nbsp;square plots. The Farm is located in the upper left plot and the Market is located in the lower left plot. Betsy takes a tour of the township going from Farm to Market by walking through every plot exactly once. Write a program that will count how many unique tours Betsy can take in going from Farm to Market for any value of&nbsp;<em>n &lt;= 6</em>.</p><p>Since the number of solutions is required, the entire tree must be searched, even if one solution is found quickly. So it doesn't matter from a time perspective whether DFS or BFS is used. Since DFS takes less space, it is the search of choice for this problem.</p><h5>Udder Travel [USACO 1995 Final Round; Piele]</h5><p>The Udder Travel cow transport company is based at farm A and owns one cow truck which it uses to pick up and deliver cows between seven farms A, B, C, D, E, F, and G. The (commutative) distances between farms are given by an array. Every morning, Udder Travel has to decide, given a set of cow moving orders, the order in which to pick up and deliver cows to minimize the total distance traveled. Here are the rules:</p><ul><li>The truck always starts from the headquarters at farm A and must return there when the day's deliveries are done.</li><li>The truck can only carry one cow at a time.</li><li>The orders are given as pairs of letters denoting where a cow is to be picked up followed by where the cow is to be delivered.</li></ul><p>Your job is to write a program that, given any set of orders, determines the shortest route that takes care of all the deliveries, while starting and ending at farm A.</p><p>Since all possibilities must be tried in order to ensure the best one is found, the entire tree must be searched, which takes the same amount of time whether using DFS or BFS. Since DFS uses much less space and is conceptually easier to implement, use that.</p><h5>Desert Crossing [1992 IOI, adapted]</h5><p>A group of desert nomads is working together to try to get one of their group across the desert. Each nomad can carry a certain number of quarts of water, and each nomad drinks a certain amount of water per day, but the nomads can carry differing amounts of water, and require different amounts of water. Given the carrying capacity and drinking requirements of each nomad, find the minimum number of nomads required to get at least one nomad across the desert.</p><p>All the nomads must survive, so every nomad that starts out must either turn back at some point, carrying enough water to get back to the start or must reach the other side of the desert. However, if a nomad has surplus water when it is time to turn back, the water can be given to their friends, if their friends can carry it.</p><p>Analysis: This problem actually is two recursive problems: one recursing on the set of nomads to use, the other on when the nomads turn back. Depth-first search with iterative deepening works well here to determine the nomads required, trying first if any one can make it across by themselves, then seeing if two work together to get across, etc.</p><h5>Addition Chains</h5><p>An addition chain is a sequence of integers such that the first number is 1, and every subsequent number is the sum of some two (not necessarily unique) numbers that appear in the list before it. For example, 1 2 3 5 is such a chain, as 2 is 1+1, 3 is 2+1, and 5 is 2+3. Find the minimum length chain that ends with a given number.</p><p>Analysis: Depth-first search with iterative deepening works well here, as DFS has a tendency to first try 1 2 3 4 5 ... n, which is really bad and the queue grows too large very quickly for BFS.</p><div><br></div></span><img src ="http://www.cppblog.com/Joe/aggbug/129317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-10 10:58 <a href="http://www.cppblog.com/Joe/archive/2010/10/10/129317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>USACO Calf Flac</title><link>http://www.cppblog.com/Joe/archive/2010/10/09/129214.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sat, 09 Oct 2010 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/10/09/129214.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/129214.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/10/09/129214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/129214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/129214.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://ace.delos.com/usacoprob2?a=NAqufR1Vt6H&amp;S=calfflac">http://ace.delos.com/usacoprob2?a=NAqufR1Vt6H&amp;S=calfflac</a><br><br>思路:<br>不是很难，枚举，但需要注意很多细节<br>另外，要注意存在奇数与偶数长度的回文这两种情况<br>完全参考ANALYSIS，学习到很多纯指针操作字符串的写法<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">ID:&nbsp;simplyz2<br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">LANG:&nbsp;C<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">TASK:&nbsp;calfflac<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">assert.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;void&nbsp;assert(int&nbsp;exp);&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ctype.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_LEN&nbsp;21000</span><span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;text[MAX_LEN],&nbsp;fulltext[MAX_LEN];<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pal;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pallen;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">fwd,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">bkwd,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">end,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;pallen&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;text&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;strlen(text);<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">text;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(fwd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">p,&nbsp;bkwd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">p;&nbsp;fwd</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">end&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;bkwd</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">text&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">fwd</span><span style="color: #000000; ">==*</span><span style="color: #000000; ">bkwd;&nbsp;fwd</span><span style="color: #000000; ">++</span><span style="color: #000000; ">,&nbsp;bkwd</span><span style="color: #000000; ">--</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;odd:&nbsp;middle,&nbsp;such&nbsp;as&nbsp;'aba'&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bkwd</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fwd&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;bkwd;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pallen)&nbsp;{<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pallen&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len;<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bkwd;<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(fwd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">p</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;bkwd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">p;&nbsp;fwd</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">end&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;bkwd</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">text&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">fwd</span><span style="color: #000000; ">==*</span><span style="color: #000000; ">bkwd;&nbsp;fwd</span><span style="color: #000000; ">++</span><span style="color: #000000; ">,&nbsp;bkwd</span><span style="color: #000000; ">--</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;even:&nbsp;left&nbsp;middle,&nbsp;such&nbsp;as&nbsp;'abba'&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bkwd</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fwd&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;bkwd;<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pallen)&nbsp;{<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pallen&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len;<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bkwd;<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">output()<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;n;<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;&nbsp;<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pal&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;text;<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;pallen);<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">fulltext;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(isalpha(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p))<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;n)<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pallen&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputc(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p,&nbsp;stdout);<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(isalpha(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p))<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">q;<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c;<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">calfflac.in</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;stdin);<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">calfflac.out</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">w</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;stdout);<br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fulltext;<br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;text;<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">((c</span><span style="color: #000000; ">=</span><span style="color: #000000; ">getc(stdin))&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;operation&nbsp;on&nbsp;each&nbsp;char&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(isalpha(c))<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">q</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tolower(c);&nbsp;<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;'++''s&nbsp;priority&nbsp;is&nbsp;higher&nbsp;than&nbsp;'*',&nbsp;and&nbsp;'++'&nbsp;first&nbsp;return&nbsp;'p',&nbsp;than&nbsp;move&nbsp;the&nbsp;pointer&nbsp;forward&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c;<br></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;output();<br></span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/129214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-10-09 17:05 <a href="http://www.cppblog.com/Joe/archive/2010/10/09/129214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   线段树(2)</title><link>http://www.cppblog.com/Joe/archive/2010/09/15/126676.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Wed, 15 Sep 2010 10:49:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/15/126676.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126676.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/15/126676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126676.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126676.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从简单说起，线段树其实可以理解成一种特殊的二叉树。但是这种二叉树较为平衡，和静态二叉树一样，都是提前已经建立好的树形结构。针对性强，所以效率要高。这里又想到了一句题外话：动态和静态的差别。动态结构较为灵活，但是速度较慢；静态结构节省内存，速度较快。接着回到线段树上来，线段树是建立在线段的基础上，每个结点都代表了一条线段[a , b]。长度为1的线段成为元线段。非元线段都有两个子结点，左结点代表的线...&nbsp;&nbsp;<a href='http://www.cppblog.com/Joe/archive/2010/09/15/126676.html'>阅读全文</a><img src ="http://www.cppblog.com/Joe/aggbug/126676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-15 18:49 <a href="http://www.cppblog.com/Joe/archive/2010/09/15/126676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   线段树(1)</title><link>http://www.cppblog.com/Joe/archive/2010/09/15/126675.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Wed, 15 Sep 2010 10:46:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/15/126675.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126675.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/15/126675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126675.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">好久没写过算法了，添一个吧，写一个线段树的入门知识，比较大众化。</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">上次在湖大，其中的一道题数据很强，我试了好多种优化都TLE，相信只能用线段树才能过。回来之后暗暗又学了一次线段树，想想好像是第三次学了，像网络流一样每学一次都有新的体会。</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">把问题简化一下：</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">在自然数，且所有的数不大于30000的范围内讨论一个问题：现在已知n条线段，把端点依次输入告诉你，然后有m个询问，每个询问输入一个点，要求这个点在多少条线段上出现过；</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">最基本的解法当然就是读一个点，就把所有线段比一下，看看在不在线段中；</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">每次询问都要把n条线段查一次，那么m次询问，就要运算m*n次，复杂度就是O(m*n)</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">这道题m和n都是30000，那么计算量达到了10^9；而计算机1秒的计算量大约是10^8的数量级，所以这种方法无论怎么优化都是超时</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">-----</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">因为n条线段是固定的，所以某种程度上说每次都把n条线段查一遍有大量的重复和浪费；</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">线段树就是可以解决这类问题的数据结构</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">举例说明：已知线段[2,5] [4,6] [0,7]；求点2,4,7分别出现了多少次</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">在[0,7]区间上建立一棵满二叉树：（为了和已知线段区别，用【】表示线段树中的线段）</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【0,7】<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【0,3】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【4,7】<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【0,1】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【2,3】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【4,5】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【6,7】<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>【0,0】 【1,1】&nbsp;&nbsp;&nbsp; 【2,2】 【3,3】&nbsp;&nbsp; 【4,4】&nbsp; 【5,5】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【6,6】 【7,7】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">每个节点用结构体：</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">struct line<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int left,right;//左端点、右端点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;//记录这条线段出现了多少次，默认为0<br>}a[16];</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">和堆类似，满二叉树的性质决定a[i]的左儿子是a[2*i]、右儿子是a[2*i+1];</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">然后对于已知的线段依次进行插入操作：</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">从树根开始调用递归函数insert</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">void insert(int s,int t,int step)//要插入的线段的左端点和右端点、以及当前线段树中的某条线段<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s==a[step].left &amp;&amp; t==a[step].right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[step].n++;//插入的线段匹配则此条线段的记录+1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;//插入结束返回<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a[step].left==a[step].right)&nbsp;&nbsp; return;//当前线段树的线段没有儿子，插入结束返回<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mid=(a[step].left+a[step].right)/2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mid&gt;=t)&nbsp;&nbsp;&nbsp; insert(s,t,step*2);//如果中点在t的右边，则应该插入到左儿子<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (mid&lt;s)&nbsp;&nbsp;&nbsp; insert(s,t,step*2+1);//如果中点在s的左边，则应该插入到右儿子<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else//否则，中点一定在s和t之间，把待插线段分成两半分别插到左右儿子里面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(s,mid,step*2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(mid+1,t,step*2+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">三条已知线段插入过程：</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">[2,5]</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[2,5]与【0,7】比较，分成两部分：[2,3]插到左儿子【0,3】，[4,5]插到右儿子【4,7】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[2,3]与【0,3】比较，插到右儿子【2,3】；[4,5]和【4,7】比较，插到左儿子【4,5】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[2,3]与【2,3】匹配，【2,3】记录+1；[4,5]与【4,5】匹配，【4,5】记录+1</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">[4,6]</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[4,6]与【0,7】比较，插到右儿子【4,7】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[4,6]与【4,7】比较，分成两部分，[4,5]插到左儿子【4,5】；[6,6]插到右儿子【6,7】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[4,5]与【4,5】匹配，【4,5】记录+1；[6,6]与【6,7】比较，插到左儿子【6,6】</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[6,6]与【6,6】匹配，【6,6】记录+1</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">[0,7]</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">--[0,7]与【0,7】匹配，【0,7】记录+1</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">插入过程结束，线段树上的记录如下（红色数字为每条线段的记录n）：</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 【0,7】<br></span><span style="line-height: 24px; font-size: medium; "><span style="line-height: 24px; color: rgb(255, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 1<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【0,3】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【4,7】<br></span><span style="line-height: 24px; font-size: medium; "><span style="line-height: 24px; color: rgb(255, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【0,1】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【2,3】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【4,5】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【6,7】<br><span style="line-height: 24px; color: rgb(255, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>【0,0】 【1,1】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【2,2】&nbsp;&nbsp;&nbsp;【3,3】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【4,4】 【5,5】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【6,6】&nbsp; 【7,7】<br><span style="line-height: 24px; color: rgb(255, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</span></span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">询问操作和插入操作类似，也是递归过程，略</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">2——依次把【0,7】 【0,3】 【2,3】 【2,2】的记录n加起来，结果为2</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">4——依次把【0,7】 【4,7】 【4,5】 【4,4】的记录n加起来，结果为3</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">7——依次把【0,7】 【4,7】 【6,7】 【7,7】的记录n加起来，结果为1</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">不管是插入操作还是查询操作，每次操作的执行次数仅为树的深度——logN</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">建树有n次插入操作，n*logN，一次查询要logN，m次就是m*logN；总共复杂度O(n+m)*logN，这道题N不超过30000，logN约等于14，所以计算量在10^5～10^6之间，比普通方法快了1000倍；</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">这道题是线段树最基本的操作，只用到了插入和查找；删除操作和插入类似，扩展功能的还有测度、连续段数等等，在N数据范围很大的时候，依然可以用离散化的方法建树。</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">湖大的那道题目绕了个小弯子，alpc12有详细的题目和解题报告，有兴趣的话可以看看</span><a href="http://www.cppblog.com/sicheng/archive/2008/01/09/40791.html" style="text-decoration: none; color: rgb(0, 107, 173); "><span style="line-height: 24px; font-size: medium; ">http://www.cppblog.com/sicheng/archive/2008/01/09/40791.html</span></a></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 24px; font-size: medium; ">线段树的经典题目就是poj1177的picturehttp://acm.pku.edu.cn/JudgeOnline/problem?id=1177</span></p></span>
<img src ="http://www.cppblog.com/Joe/aggbug/126675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-15 18:46 <a href="http://www.cppblog.com/Joe/archive/2010/09/15/126675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1270   Following Orders</title><link>http://www.cppblog.com/Joe/archive/2010/09/14/126611.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 14 Sep 2010 12:00:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/14/126611.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126611.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/14/126611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126611.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126611.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1270">http://acm.pku.edu.cn/JudgeOnline/problem?id=1270</a><br><br>思路:<br>拓扑排序适合于描述事件发生的先后次序<br>这题，对于a&gt;b这样的题目要求，就非常适合用拓扑排序来进行<br><br>一次AC，写的过程还接了个女朋友的电话，跟同学聊了会天，o(&#8745;_&#8745;)o...哈哈<br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;STR_LEN&nbsp;207</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_N&nbsp;26</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;adj[MAX_N][MAX_N],&nbsp;in_dgr[MAX_N];<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;visited[MAX_N];<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;total,&nbsp;ch[MAX_N];<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;ans[MAX_N];<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">init()<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;f,&nbsp;t,&nbsp;len;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;str[STR_LEN];<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(ch,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(ch));<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(in_dgr,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(in_dgr));<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(adj,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(adj));<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(visited,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(visited));<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(ans,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(ans));<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fgets(str,&nbsp;STR_LEN,&nbsp;stdin)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strlen(str);<br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">len;&nbsp;i</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(str[i]</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;str[i]</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">z</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">total;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">ch[str[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">];<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;fgets(str,&nbsp;STR_LEN,&nbsp;stdin);<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strlen(str);<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">len;&nbsp;i</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((i</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">%</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;str[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;str[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adj[f][t]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">in_dgr[t];<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">topo_sort(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;depth)<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j;<br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(depth&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;total)&nbsp;{<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;ans);<br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ch[i]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">visited[i]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">in_dgr[i])&nbsp;{<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visited[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[depth]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i;<br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_N;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(adj[i][j])<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">in_dgr[j];<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topo_sort(depth</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visited[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">MAX_N;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(adj[i][j])<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">in_dgr[j];<br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(init())&nbsp;{<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topo_sort(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/126611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-14 20:00 <a href="http://www.cppblog.com/Joe/archive/2010/09/14/126611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]   差分约束系统</title><link>http://www.cppblog.com/Joe/archive/2010/09/12/126445.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 12 Sep 2010 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/12/126445.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126445.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/12/126445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126445.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: Georgia; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">poj 1275 3159 1364 1716 1201 3169<br style="line-height: normal; ">这类问题，就像网络流，图论，dp，关键在列出满足的表达式，建立好数学模型，剩下的过程就很简单了。所以主要难点在于构图，从实际的描述抽象成模型。准确找到约束条件。<br style="line-height: normal; "><br style="line-height: normal; ">关于基础知识可以查看clrs 22.4节。下面只介绍我遇到的一些问题和理解。<br style="line-height: normal; "><br style="line-height: normal; ">所谓的差分约束系统，实际上指一系列的表达式，满足 形如{ xi - xj &lt;= a}<br style="line-height: normal; ">求解实际上转化成了图论里的一个等价问题，最短路问题，实际上巧妙的利用了最短路具有的性质 di - dj &lt;= w(j,i)<br style="line-height: normal; ">如果这样的最短路求成来了，他们的值便可以直接作为xi xj的一组可行解。<br style="line-height: normal; "><br style="line-height: normal; ">图论里求最短路，有很多方法，差分约束系统，一般利用的是单源最短路，而在单源最短路算法中，常见的是dijkstra和bellman-ford算法。这两个算法各有优劣。<br style="line-height: normal; "><br style="line-height: normal; ">dijkstra算法，效率比较高，如果用堆实现，可以达到O(vlogv+E)的复杂度,但是它只能解决正边权类型的问题，对于负边权的问题，必须采用bellman-ford算法，它的复杂度是VE.<br style="line-height: normal; "><br style="line-height: normal; "><font style="line-height: normal; font-weight: bold; color: rgb(255, 0, 255); ">bellman-ford算法很强大，不单可以求最短路，还可以求最长路。</font>一般如果约束条件是 &lt;=形式的，就标志着要求最短路，&gt;=则要通过求最长路解决。<br style="line-height: normal; ">当然这两种约束是可以转化的，因为 xi - xj &lt;= a实际上等价于xj- xi &gt;= a。<br style="line-height: normal; "><br style="line-height: normal; ">一.优化途径：<br style="line-height: normal; ">1.如果改变边的松弛(relax)顺序，程序的执行顺序会有很多改观<br style="line-height: normal; ">2.当所有边都不能再松弛的时候，便可以跳出循环了，不必全部循环V-1次<br style="line-height: normal; ">这些可以通过poj1716 1201体验到<br style="line-height: normal; ">二.关于Dist[]的初始化化<br style="line-height: normal; ">1.如果将源点到各点的距离初始化为0，最终求出的最短路满足 它们之间相互最接近了<br style="line-height: normal; ">2.如果将源点到各点的距离初始化为INF(无穷大)，其中之1为0，最终求出的最短路满足 它们与该点之间相互差值最大。<br style="line-height: normal; ">这些可以从poj3169 layout 得到证实。<br style="line-height: normal; ">三.<br style="line-height: normal; ">关于dikstra算法的堆实现，有两种策略，一种是一开始把全部节点放到堆里，为每个节点维护一个在堆里的索引数组。另一种策略是当当前点被更新才放到堆里，但是要注意标记已经求得最短路的哪些点，避免重复求值。<br style="line-height: normal; ">我采用的是第一种策略，去求解的poj3159 Candies<br style="line-height: normal; "><br style="line-height: normal; ">当然还有一个优化是，如果已经找到了目标点，就可以退出了，不必全部求出最短路<br style="line-height: normal; "><br style="line-height: normal; ">四.陷阱<br style="line-height: normal; ">int a[MAX] = {INF};<br style="line-height: normal; ">注意a里面的元素只有第一个会被赋为INF,其他会<font style="line-height: normal; font-weight: bold; color: rgb(255, 0, 255); ">被赋为0，而不是INF</font>。<br style="line-height: normal; "><br style="line-height: normal; ">关于模型的建立，其实，很多情况下我们的 xi都是一个和式，比如从开头到现在的某个量的积累值，比如poj1716 1201中，我们要定义x[i]为点集里小于i的数的个数，则x[j] - x[i]则表示了落在线段区间[i,j]的点的个数。还有poj1364 King 也是类似，另外一些可能就是比较简单的直接的约束关系。<br style="line-height: normal; "><br style="line-height: normal; ">比较复杂的如poj1275 Cashier Employment<br style="line-height: normal; ">这个问题比较特殊，乍看其他上述问题都是寻找最小数目的点，使这些点可以覆盖线段。而这个则是找一些数目的人，而人实际上是一些线段，使这些线段可以在那些特点的总数目可以满足要求并且数目最少。关键在定义一个状态，这里如果大胆定义i时刻出纳员数目s[i]，就可以了，然后利用这个s[i]便可以找到所有的约束关系，并列出不等式，这样模型就建立好了。<br style="line-height: normal; "><br style="line-height: normal; ">这个可以参考刘汝佳的书P307，图论最短路那部分，刚好以这个问题为例，而且这个问题求的就是最长路。对于sum可以二分进行优化，不过我直接穷举也过了。<br style="line-height: normal; "><br style="line-height: normal; "><br style="line-height: normal; ">poj3159 Candies<br style="line-height: normal; ">这是我接触差分约束的第一题。设S[a]为kid a获得的candies数，则每一行代表的约束是S[b]-S[a]&lt;=c，目标函数是使得S=S[N]-S[1]最大。<br style="line-height: normal; ">利用差分约束的思想建图，对于每一条约束，从a向b做一条长为c的边，则从1到N的最短路即为所求。由于本题c皆为非负数，所以可以用Dijkstra高效解决。</span>
<img src ="http://www.cppblog.com/Joe/aggbug/126445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-12 10:53 <a href="http://www.cppblog.com/Joe/archive/2010/09/12/126445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz] SPFA算法---Bellman-Ford算法的改进</title><link>http://www.cppblog.com/Joe/archive/2010/09/11/126410.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sat, 11 Sep 2010 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/11/126410.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126410.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/11/126410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126410.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">一、</span><strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">Bellman-Ford</span></strong><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">最优性原理</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">它是最优性原理的直接应用，算法基于以下事实：</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l</span><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">如果最短路存在，则每个顶点最多经过一次，因此不超过<span lang="EN-US" style="line-height: 28px; ">n-1</span>条边；</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l</span><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">长度为<span lang="EN-US" style="line-height: 28px; ">k</span>的路由长度为<span lang="EN-US" style="line-height: 28px; ">k-1</span>的路加一条边得到；</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">由最优性原理，只需依次考虑长度为<span lang="EN-US" style="line-height: 28px; ">1</span>，<span lang="EN-US" style="line-height: 28px; ">2</span>，&#8230;，<span lang="EN-US" style="line-height: 28px; ">k-1</span>的最短路。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><a name=".E9.80.82.E7.94.A8.E6.9D.A1.E4.BB.B6.26." style="text-decoration: none; color: rgb(0, 107, 173); "></a><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">适用条件<span lang="EN-US" style="line-height: 28px; ">&amp;</span>范围</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">单源最短路径<span lang="EN-US" style="line-height: 28px; ">(</span>从源点<span lang="EN-US" style="line-height: 28px; ">s</span>到其它所有顶点<span lang="EN-US" style="line-height: 28px; ">v);</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">有向图<span lang="EN-US" style="line-height: 28px; ">&amp;</span>无向图<span lang="EN-US" style="line-height: 28px; ">(</span>无向图可以看作<span lang="EN-US" style="line-height: 28px; ">(u,v),(v,u)</span>同属于边集<span lang="EN-US" style="line-height: 28px; ">E</span>的有向图<span lang="EN-US" style="line-height: 28px; ">);</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">边权可正可负<span lang="EN-US" style="line-height: 28px; ">(</span>如有负权回路输出错误提示<span lang="EN-US" style="line-height: 28px; ">);</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l</span><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束系统（需要首先构造约束图，构造不等式时<span lang="EN-US" style="line-height: 28px; ">&gt;=</span>表示求最小值<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>作为最长路，<span lang="EN-US" style="line-height: 28px; ">&lt;=</span>表示求最大值<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>作为最短路。<span lang="EN-US" style="line-height: 28px; ">&lt;=</span>构图时<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>有负环说明无解；求不出最短路（为<span lang="EN-US" style="line-height: 28px; ">Inf</span>）为任意解。<span lang="EN-US" style="line-height: 28px; ">&gt;=</span>构图时类似）。<a name=".E7.AE.97.E6.B3.95.E6.8F.8F.E8.BF.B0" style="text-decoration: none; color: rgb(0, 107, 173); "></a><span lang="EN-US" style="line-height: 28px; "><span style="line-height: 28px; ">&nbsp;&nbsp;</span></span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法描述</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">对每条边进行<span lang="EN-US" style="line-height: 28px; ">|V|-1</span>次<span lang="EN-US" style="line-height: 28px; ">Relax</span>操作<span lang="EN-US" style="line-height: 28px; ">;</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">如果存在<span lang="EN-US" style="line-height: 28px; ">(u,v)</span>&#8712;<span lang="EN-US" style="line-height: 28px; ">E</span>使得<span lang="EN-US" style="line-height: 28px; ">dis[u]+w&lt;dis[v],</span>则存在负权回路<span lang="EN-US" style="line-height: 28px; ">;</span>否则<span lang="EN-US" style="line-height: 28px; ">dis[v]</span>即为<span lang="EN-US" style="line-height: 28px; ">s</span>到<span lang="EN-US" style="line-height: 28px; ">v</span>的最短距离<span lang="EN-US" style="line-height: 28px; ">,pre[v]</span>为前驱。<span lang="EN-US" style="line-height: 28px; ">&nbsp;<a name=".E6.97.B6.E7.A9.BA.E5.A4.8D.E6.9D.82.E5." style="text-decoration: none; color: rgb(0, 107, 173); "></a><span style="line-height: 28px; ">&nbsp;&nbsp;</span></span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">时空复杂度</span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">for i:=1 to |V|-1 do</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>for&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">每条边<span lang="EN-US" style="line-height: 28px; ">(u,v)</span>&#8712;<span lang="EN-US" style="line-height: 28px; ">E do<span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;</span>Relax(u,v,w);</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">for</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">每条边<span lang="EN-US" style="line-height: 28px; ">(u,v)</span>&#8712;<span lang="EN-US" style="line-height: 28px; ">E do</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">if dis[u]+w&lt;dis[v] Then Exit(False)</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法时间复杂度<span lang="EN-US" style="line-height: 28px; ">O(VE)</span>。因为算法简单，适用范围又广，虽然复杂度稍高，仍不失为一个很实用的算法。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><a name=".E6.94.B9.E8.BF.9B.E5.92.8C.E4.BC.98.E5." style="text-decoration: none; color: rgb(0, 107, 173); "></a><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">改进和优化<span lang="EN-US" style="line-height: 28px; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;</span></span></span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a title="SPFA" href="http://www.nocow.cn/index.php/SPFA" style="text-decoration: none; color: rgb(0, 107, 173); "><span lang="EN-US" style="line-height: 28px; color: windowtext; text-decoration: none; "><span lang="EN-US" style="line-height: 28px; ">如果循环n-1</span></span><span lang="EN-US" style="line-height: 28px; color: windowtext; text-decoration: none; "><span lang="EN-US" style="line-height: 28px; ">次以前已经发现不存在紧边则可以立即终止； Yen</span></span><span lang="EN-US" style="line-height: 28px; color: windowtext; text-decoration: none; "><span lang="EN-US" style="line-height: 28px; ">氏改进（不降低渐进复杂度）；SPFA</span></span></a></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">二、</span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>SPFA</strong></span><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法简介</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">SPFA(Shortest Path Faster Algorithm)</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">是<span lang="EN-US" style="line-height: 28px; "><a title="Bellman-Ford算法" href="http://www.nocow.cn/index.php/Bellman-Ford%E7%AE%97%E6%B3%95" style="text-decoration: none; color: rgb(0, 107, 173); "><span style="line-height: 28px; color: windowtext; text-decoration: none; ">Bellman-Ford</span><span lang="EN-US" style="line-height: 28px; color: windowtext; text-decoration: none; "><span lang="EN-US" style="line-height: 28px; ">算法</span></span></a></span>的一种<span lang="EN-US" style="line-height: 28px; "><a title="队列" href="http://www.nocow.cn/index.php/%E9%98%9F%E5%88%97" style="text-decoration: none; color: rgb(0, 107, 173); "><span lang="EN-US" style="line-height: 28px; color: windowtext; text-decoration: none; "><span lang="EN-US" style="line-height: 28px; ">队列</span></span></a></span>实现，减少了不必要的冗余计算。 它可以在<span lang="EN-US" style="line-height: 28px; ">O(kE)</span>的时间复杂度内求出源点到其他所有点的最短路径，可以处理负边。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><a name=".E7.AE.97.E6.B3.95.E6.B5.81.E7.A8.8B" style="text-decoration: none; color: rgb(0, 107, 173); "></a><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法流程</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">SPFA</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">对<span lang="EN-US" style="line-height: 28px; ">Bellman-Ford</span>算法优化的关键之处在于意识到：<strong><span style="line-height: 28px; color: black; ">只有那些在前一遍松弛中改变了距离估计值的点，才可能引起他们的邻接点的距离估计值的改变</span></strong>。因此，算法大致流程是用一个队列来进行维护，即用一个先进先出的队列来存放被成功松弛的顶点。初始时，源点<span lang="EN-US" style="line-height: 28px; ">s</span>入队。当队列不为空时，取出队首顶点，对它的邻接点进行松弛。如果某个邻接点松弛成功，且该邻接点不在队列中，则将其入队。经过有限次的松弛操作后，队列将为空，算法结束。<span lang="EN-US" style="line-height: 28px; ">SPFA</span>算法的实现，需要用到一个先进先出的队列<span lang="EN-US" style="line-height: 28px; ">&nbsp;queue&nbsp;</span>和一个指示顶点是否在队列中的标记数组<span lang="EN-US" style="line-height: 28px; ">mark</span>。为了方便查找某个顶点的邻接点，图采用临界表存储。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><a name=".E7.AE.97.E6.B3.95.E4.BB.A3.E7.A0.81" style="text-decoration: none; color: rgb(0, 107, 173); "></a><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">算法代码</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; color: black; font-size: 14pt; ">Procedure</span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;SPFA;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; color: rgb(177, 177, 0); font-size: 14pt; ">Begin</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>initialize-single-source<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>G,s<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>initialize-queue<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>Q<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>enqueue<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>Q,s<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">while</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">not</span>&nbsp;empty<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>Q<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">do</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">begin</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>u:=dequeue<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>Q<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">for</span>&nbsp;each v</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&#8712;<span lang="EN-US" style="line-height: 28px; ">adj<span style="line-height: 28px; color: rgb(102, 204, 102); ">[</span>u<span style="line-height: 28px; color: rgb(102, 204, 102); ">]</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">do</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">begin</span></span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>tmp:=d<span style="line-height: 28px; color: rgb(102, 204, 102); ">[</span>v<span style="line-height: 28px; color: rgb(102, 204, 102); ">]</span>; relax<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>u,v<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">if</span>&nbsp;<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>tmp&lt;&gt;d<span style="line-height: 28px; color: rgb(102, 204, 102); ">[</span>v<span style="line-height: 28px; color: rgb(102, 204, 102); ">])</span>&nbsp;and&nbsp;<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">not</span>&nbsp;v&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">in</span>&nbsp;Q<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>&nbsp;<span style="line-height: 28px; color: rgb(177, 177, 0); ">then</span>&nbsp;enqueue<span style="line-height: 28px; color: rgb(102, 204, 102); ">(</span>v<span style="line-height: 28px; color: rgb(102, 204, 102); ">)</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">end</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; color: rgb(177, 177, 0); ">end</span>;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; color: rgb(177, 177, 0); font-size: 14pt; ">End</span><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">负环处理</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;</span></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">需要特别注意的是：仅当图不存在负权回路时，<span lang="EN-US" style="line-height: 28px; ">SPFA</span>能正常工作。如果图存在负权回路，由于负权回路上的顶点无法收敛，总有顶点在入队和出队往返，队列无法为空，这种情况下<span lang="EN-US" style="line-height: 28px; ">SPFA</span>无法正常结束。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">判断负权回路的方案很多，世间流传最广、比较容易实现并且高效的方法的是记录每个结点进队次数，超过<span lang="EN-US" style="line-height: 28px; ">|V|</span>次表示有负权</span></strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">三、</span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">学以致用</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1201" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 1201<span style="line-height: 28px; ">&nbsp;</span>Intervals</a>&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束系统</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">设<span lang="EN-US" style="line-height: 28px; ">S(i)</span>为<span lang="EN-US" style="line-height: 28px; ">&nbsp;0..i-1&nbsp;</span>中在最终序列中的的整数个数。则约束条件如下<span lang="EN-US" style="line-height: 28px; ">:</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">S(b)-S(a) &gt;= c</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">0 &lt;= S(i+1) - S(i) &lt;= 1 &lt;==&gt; S(i+1)-S(i) &gt;= 0;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 28px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>S(i)-S(i+1) &gt;= -1</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">注意本题要求的是最小值<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>而按照<span lang="EN-US" style="line-height: 28px; ">&gt;=</span>号建图后发现图中有负环<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>怎么办呢<span lang="EN-US" style="line-height: 28px; ">?</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">其实很简单<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>本题求的不是最短路<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>而是最长路<span lang="EN-US" style="line-height: 28px; ">! Bellman_ford</span>即可<span lang="EN-US" style="line-height: 28px; ">!</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1275" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 1275 Cashier Employment</a>&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">出纳员的雇佣</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">黑书上有详细讲解</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1364" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 1364 King&nbsp;</a></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束系统</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">这个题目构图之后<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>只需要用<span lang="EN-US" style="line-height: 28px; ">bellman_ford</span>判断是否有负圈<span lang="EN-US" style="line-height: 28px; ">.</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">构图方法<span lang="EN-US" style="line-height: 28px; ">:</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">首先进行转换<span lang="EN-US" style="line-height: 28px; ">:a[j]+...+a[j+m] = a[1]+...a[j+m] - (a[1]+...+a[j-1]) = sum[j+m] -</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">sum[j-1] &gt;(&lt;) ki.&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束只能全部是<span lang="EN-US" style="line-height: 28px; ">&lt;=</span>或者<span lang="EN-US" style="line-height: 28px; ">(&gt;=).</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">第二步转换<span lang="EN-US" style="line-height: 28px; ">: sum[j+m]-sum[j-1] &lt;= ki-1&nbsp;</span>或者<span lang="EN-US" style="line-height: 28px; ">&nbsp;sum[j-1]-sum[j+m] &lt;= -ki-1.</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">约束图构造好后就是简单的<span lang="EN-US" style="line-height: 28px; ">Bellman-Ford</span>了<span lang="EN-US" style="line-height: 28px; ">!</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1716" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 1716 Integer Intervals</a><span style="line-height: 28px; text-decoration: underline; "><span style="line-height: 28px; color: blue; ">&nbsp;</span></span></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">是<span lang="EN-US" style="line-height: 28px; ">1201</span>的简单版本<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>贪心算法能够得到更好的效果<span lang="EN-US" style="line-height: 28px; ">.</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2983" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 2983 Is the Information Reliable?</a></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束题<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>处理一下等号的情况<span lang="EN-US" style="line-height: 28px; ">,&nbsp;</span>然后普通的<span lang="EN-US" style="line-height: 28px; ">Bellman_ford</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3159" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 3159 Candies</a><strong><span style="line-height: 28px; color: blue; ">&nbsp;</span></strong></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">最短路径</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">Bellman-Ford</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">超时<span lang="EN-US" style="line-height: 28px; ">, Dijkstra</span>算法可以高效解决<span lang="EN-US" style="line-height: 28px; ">, SPFA(</span>队列<span lang="EN-US" style="line-height: 28px; ">)</span>居然超时<span lang="EN-US" style="line-height: 28px; ">...SPFA</span>修改为堆栈实现就过了<span lang="EN-US" style="line-height: 28px; ">.</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3169" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 3169&nbsp;<span style="line-height: 28px; ">Layout</span></a><strong><span style="line-height: 28px; color: blue; ">&nbsp;</span></strong></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">差分约束</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">Bellman-Ford&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">和<span lang="EN-US" style="line-height: 28px; ">&nbsp;SPFA&nbsp;</span>实现均可</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3259" style="text-decoration: none; color: rgb(0, 107, 173); ">POJ 3259 Wormholes</a>&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">判断负权回路</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.tju.edu.cn/toj/showp2976.html" target="_blank" style="text-decoration: none; color: rgb(0, 107, 173); ">TOJ 2976 Path</a>&nbsp;</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">单纯的最短路径 可练习<span lang="EN-US" style="line-height: 28px; ">SPFA</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><a href="http://acm.zju.edu.cn/show_problem.php?pid=3033" style="text-decoration: none; color: rgb(0, 107, 173); ">ZOJ 3033 Board Games&nbsp;</a></span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">我做的第一道<span lang="EN-US" style="line-height: 28px; ">Bellman-Ford</span>题目</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">首先，<span lang="EN-US" style="line-height: 28px; ">DFS</span>判断可达性，不可达直接输出<span lang="EN-US" style="line-height: 28px; ">infinity</span>结束，可达，<span lang="EN-US" style="line-height: 28px; ">bellman-ford</span>判断是否存在负环，存在输出<span lang="EN-US" style="line-height: 28px; ">infinity</span>，否则，输出最短距离。</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; "><span style="line-height: 28px; ">&nbsp;</span></span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">四、</span></strong><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 28px; ">&nbsp;&nbsp;</span></span><strong><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">参考资料</span></strong></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">《算法导论》；《算法艺术与信息学竞赛》；《算法艺术与信息学竞赛学习指导》；<span lang="EN-US" style="line-height: 28px; "><a href="http://www.nocow.cn/" target="_blank" style="text-decoration: none; color: rgb(0, 107, 173); ">NOCOW</a></span>；百度百科；<span lang="EN-US" style="line-height: 28px; "><a href="http://hi.baidu.com/accplaystation/blog/item/7c6d10136ef28b856438db6b.html" target="_blank" style="text-decoration: none; color: rgb(0, 107, 173); "><span style="line-height: 28px; color: rgb(129, 0, 129); ">alpc55</span><span lang="EN-US" style="line-height: 28px; color: rgb(129, 0, 129); "><span lang="EN-US" style="line-height: 28px; ">的小地方</span></span></a></span>；<span lang="EN-US" style="line-height: 28px; "><a href="http://hi.baidu.com/highkobe/blog/item/e95bb263480808660c33fae2.html" target="_blank" style="text-decoration: none; color: rgb(0, 107, 173); ">highkobe</a></span>；（谢谢分享）</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">&nbsp;</span></p><p class="MsoNormal" align="left" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><span lang="EN-US" style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">p.s.</span><span style="line-height: 28px; font-family: 宋体; font-size: 14pt; ">：匆匆总结拿来分享，如有不当之处，望指出！<span lang="EN-US" style="line-height: 28px; ">----By Fandywang</span></span></p></span>
<img src ="http://www.cppblog.com/Joe/aggbug/126410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-11 17:00 <a href="http://www.cppblog.com/Joe/archive/2010/09/11/126410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1054   The Troublesome Frog</title><link>http://www.cppblog.com/Joe/archive/2010/09/07/126099.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 07 Sep 2010 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/09/07/126099.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/126099.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/09/07/126099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/126099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/126099.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1054">http://acm.pku.edu.cn/JudgeOnline/problem?id=1054</a><br><br>思路:<br>好题，枚举 + 二分<br>枚举所有可能路径的前两个点<br>要注意的是:&nbsp;<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: 'Times New Roman', Times, serif; font-size: 16px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">starting outside the paddy on one side and ending outside the paddy on the other side</span><br><br>代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;enumerate&nbsp;the&nbsp;first&nbsp;two&nbsp;points&nbsp;for&nbsp;each&nbsp;possible&nbsp;path&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_NUM&nbsp;5001</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;is_valid(x,&nbsp;y)&nbsp;((x)&gt;0&nbsp;&amp;&amp;&nbsp;(x)&lt;=R&nbsp;&amp;&amp;&nbsp;(y)&gt;0&nbsp;&amp;&amp;&nbsp;(y)&lt;=C)</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;R,&nbsp;C;<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;total;<br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;{<br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x,&nbsp;y;<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">}&nbsp;points[MAX_NUM];<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;from&nbsp;top&nbsp;to&nbsp;down,&nbsp;and&nbsp;left&nbsp;to&nbsp;right&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">compare(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg1,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg2)<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg1;<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg2;<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(a</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">x&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;b</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">x)<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">y&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;b</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">y;<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">x&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;b</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">x;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">init()<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i;<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">total);<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">total;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">points[i].x,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">points[i].y);<br></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;qsort(points,&nbsp;total,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point),&nbsp;compare);<br></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">solve()<br></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j,&nbsp;tmp,&nbsp;max&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;diff_x,&nbsp;diff_y;<br></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;p1,&nbsp;p2,&nbsp;next;<br></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ptr;<br></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">total;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">total;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;points[i];<br></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;points[j];<br></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diff_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p2.x&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;p1.x;<br></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diff_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p2.y&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;p1.y;<br></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(is_valid(p1.x</span><span style="color: #000000; ">-</span><span style="color: #000000; ">diff_x,&nbsp;p1.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">diff_y))&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;starting&nbsp;outside&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">is_valid(p1.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">max</span><span style="color: #000000; ">*</span><span style="color: #000000; ">diff_x,&nbsp;p1.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">max</span><span style="color: #000000; ">*</span><span style="color: #000000; ">diff_y))&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;pruning&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next.x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p2.x&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;diff_x;<br></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next.y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p2.y&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;diff_y;<br></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(is_valid(next.x,&nbsp;next.y))&nbsp;{<br></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((ptr</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)bsearch(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">next,&nbsp;points,&nbsp;total,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Point),&nbsp;compare))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)&nbsp;{<br></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ending&nbsp;outside&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">tmp;<br></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next.x&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;diff_x;<br></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next.y&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;diff_y;<br></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">max&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;tmp&nbsp;:&nbsp;max;<br></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;max</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;max&nbsp;:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">R,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">C)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{<br></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">}</span></div><br><img src ="http://www.cppblog.com/Joe/aggbug/126099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-09-07 17:18 <a href="http://www.cppblog.com/Joe/archive/2010/09/07/126099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于完成暑期目标：100题完结</title><link>http://www.cppblog.com/Joe/archive/2010/08/19/123972.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Thu, 19 Aug 2010 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/08/19/123972.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/123972.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/08/19/123972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/123972.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/123972.html</trackback:ping><description><![CDATA[<div>在磕磕绊绊中，终于做完一百题，完成暑期目标，会继续加油...<br><span  style="border-collapse: collapse;"><br>附: summary (revision 37)<br><br><div>Summary of PKU solved, since 05-20-2010</div><div><br></div><div>------------------------Fighting-----------------------------</div><div>------------------------Fighting-----------------------------</div><div><br></div><div>[sort]</div><div>1002 487-3279</div><div>1007 DNA Sorting</div><div>1468 Rectangles</div><div>2299 Ultra-QuickSort</div><div>2388 Who's in the Middle</div><div><br></div><div>[search(dfs, bfs, backtracking)]</div><div>1020 Anniversary Cake [good]</div><div>1077 Eight [classic][bfs, bbfs, A*]</div><div>1101 The Game</div><div>1111 Image Perimeters [interesting]</div><div>1129 Channel Allocation [classic]</div><div>1164 The Castle</div><div>1166 The Clocks</div><div>1190 Birthday Cake [good]</div><div>1198 Solitaire [classic]</div><div>1321 Chessboard Problem</div><div>1416 Shredding Company</div><div>1426 Find The Multiple</div><div>1475 Pushing Boxes [complex]</div><div>1562 Oil Deposits</div><div>1606 Jugs</div><div>1629 Fillword</div><div>1691 Painting A Board</div><div>1724 ROADS</div><div>1753 Flip Game</div><div>1775 Sum of Factorials</div><div>1915 Knight Moves</div><div>1950 Dessert</div><div>2248 Addition Chains</div><div>2251 Dungeon Master</div><div>2488 A Knight's Journey</div><div>2531 Network Saboteur</div><div>2676 Sudoku</div><div>3009 Curling 2.0</div><div>3083 Children of the Candy Corn</div><div>3087 Shuffle'm Up</div><div>3126 Prime Path</div><div>3256 Cow Picnic</div><div>3278 Catch That Cow</div><div>3373 Changing Digits [hard]</div><div>3411 Paid Roads</div><div>3414 Pots</div><div><br></div><div>[dynamic programming/memory function]</div><div>1014 Dividing [good &amp; hard]</div><div>1015 Jury Compromise</div><div>1050 To the Max [classic]</div><div>1080 Human Gene Functions</div><div>1088 Skiing [good]</div><div>1157 Little shop of flowers</div><div>1159 Palindrome</div><div>1160 Post Office [good]</div><div>1163 The Triangle</div><div>1179 Polygon [classic]</div><div>1185 Artillery position [classic, scdp]</div><div>1260 Pearls [good]</div><div>1276 Cash Machine [classic]</div><div>1458 Common Subsequence [classic]</div><div>1579 Function Run Fun</div><div>1631 Bridging signals</div><div>1887 Testing the CATCHER/2533 Longest Ordered Subsequence [classic]</div><div>1953 World Cup Noise</div><div>2192 Zipper</div><div>2250 Compromise</div><div>2479 Maximum sum/2593 Max Sequence</div><div>3356 AGTC</div><div>3624 Charm Bracelet</div><div><br></div><div>[greedy algorithm]</div><div><br></div><div>[data structure]</div><div>1028 Web Navigation (stack/array)</div><div>1611 The Suspects (union-find set)</div><div>1988 Cube Stacking (union-find set)</div><div>2524 Ubiquitous Religions (union-find set)</div><div>3253 Fence Repair (huffman tree)</div><div>3349 Snowflake Snow Snowflakes (Hash &amp; Minimal Representation)</div><div><br></div><div>[graph algorithm]</div><div><br></div><div>[others]</div><div>1001 Exponentiation (high precision)</div><div>1008 Maya Calendar</div><div>1083 Moving Tables (novel perspective) [good]</div><div>1176 Party Lamps (enumerate)</div><div>1226 Substrings</div><div>1731 Orders (permutation) [good]</div><div>2080 Calendar</div><div>2244 Eeny Meeny Moo (Josephus Problem) [good]</div><div>2503 Babelfish (string hash)</div><div>2663 Tri Tiling (recurrence) [good]</div><div><br></div><div>[easy/water]</div><div>1000 A+B Problem</div><div>1003 Hangover</div><div>1004 Financial Management</div><div>1005 I Think I Need a Houseboat</div><div>1298 The Hardest Problem Ever</div><div>1316 Self Numbers</div><div>1477 Box of Bricks</div><div>1543 Perfect Cubes (build table)</div><div>1547 Clay Bully</div><div>1552 Doubles</div><div>1565 Skew Binary</div><div>1595 Prime Cuts</div><div>1936 All in All [good]</div><div>2081 Recaman's Sequence</div><div>2105 IP Address</div><div>2726 Holiday Hotel [funny]</div></span></div><br><img src ="http://www.cppblog.com/Joe/aggbug/123972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-08-19 14:47 <a href="http://www.cppblog.com/Joe/archive/2010/08/19/123972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 2244   Eeny Meeny Moo</title><link>http://www.cppblog.com/Joe/archive/2010/08/18/123881.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Wed, 18 Aug 2010 13:02:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2010/08/18/123881.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/123881.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2010/08/18/123881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/123881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/123881.html</trackback:ping><description><![CDATA[问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2244">http://acm.pku.edu.cn/JudgeOnline/problem?id=2244</a><br><br>参考:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://baike.baidu.com/view/213217.html?fromTaglist">http://baike.baidu.com/view/213217.html?fromTaglist</a><br><br>思路:<br>从这题认识了经典的约瑟夫问题:<br><meta http-equiv="content-type" content="text/html; charset=utf-8"><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">无论是用链表实现还是用数组实现都有一个共同点：要模拟整个游戏过程，不仅程序写起来比较烦，而且时间复杂度高达O(nm)，当n，m非常大(例如上百万，上千万)的时候，几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号，而不是要读者模拟整个过程。因此如果要追求效率，就要打破常规，实施一点数学策略。<br>为了讨论方便，先把问题稍微改变一下，并不影响原意：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">问题描述：n个人（编号0~(n-1))，从0开始报数，报到(m-1)的退出，剩下的人继续从0开始报数。求胜利者的编号。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">我们知道第一个人(编号一定是m%n-1) 出列之后，剩下的n-1个人组成了一个新的约瑟夫环（以编号为k=m%n的人开始）:<br>&nbsp; k&nbsp; k+1&nbsp; k+2&nbsp; ... n-2, n-1, 0, 1, 2, ... k-2<br>并且从k开始报0。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">现在我们把他们的编号做一下转换：<br>k&nbsp;&nbsp;&nbsp;&nbsp; --&gt; 0<br>k+1&nbsp;&nbsp; --&gt; 1<br>k+2&nbsp;&nbsp; --&gt; 2<br>...<br>...<br>k-2&nbsp;&nbsp; --&gt; n-2<br>k-1&nbsp;&nbsp; --&gt; n-1</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">变换后就完完全全成为了(n-1)个人报数的子问题，假如我们知道这个子问题的解：例如x是最终的胜利者，那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗？！！变回去的公式很简单，相信大家都可以推出来：x'=(x+k)%n</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">如何知道(n-1)个人报数的问题的解？对，只要知道(n-2)个人的解就行了。(n-2)个人的解呢？当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题！好了，思路出来了，下面写递推公式：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">令f[i]表示i个人玩游戏报m退出最后胜利者的编号，最后的结果自然是f[n]</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">递推公式<br>f[1]=0;<br>f[i]=(f[i-1]+m)%i;&nbsp; (i&gt;1)</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">有了这个公式，我们要做的就是从1-n顺序算出f[i]的数值，最后结果是f[n]。因为实际生活中编号总是从1开始，我们输出f[n]+1</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">由于是逐级递推，不需要保存每个f[i]，程序也是异常简单：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">#include &lt;stdio.h&gt;<br>int main()<br>{<br>&nbsp; int n, m, i, s=0;<br>&nbsp; printf ("N M = "); scanf("%d%d", &amp;n, &amp;m);<br>&nbsp; for (i=2; i&lt;=n; i++) s=(s+m)%i;<br>&nbsp; printf ("The winner is %d\n", s+1);<br>}</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 13px; line-height: 19px; ">这个算法的时间复杂度为O(n)，相对于模拟算法已经有了很大的提高。算n，m等于一百万，一千万的情况不是问题了。可见，适当地运用数学策略，不仅可以让编程变得简单，而且往往会成倍地提高算法执行效率。<br><br><span  style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; line-height: normal; font-size: medium; ">代码:<br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;f[1]&nbsp;=&nbsp;0<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;f[i]&nbsp;=&nbsp;(f[i-1]+m)%i<br></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">josephus(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m)<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">n;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(s</span><span style="color: #000000; ">+</span><span style="color: #000000; ">m)</span><span style="color: #000000; ">%</span><span style="color: #000000; ">i;<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;s</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;m;<br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">n)</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">EOF&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;n</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;because&nbsp;first&nbsp;cut&nbsp;off&nbsp;city&nbsp;1&nbsp;and&nbsp;then&nbsp;begins&nbsp;every&nbsp;mth&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(josephus(n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;m)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">m;<br></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;m);<br></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">}</span></div></span></p><img src ="http://www.cppblog.com/Joe/aggbug/123881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2010-08-18 21:02 <a href="http://www.cppblog.com/Joe/archive/2010/08/18/123881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>