<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_hoodlum1980 [ 发发 ] 的技术博客</title><subtitle type="text">-- C, C++, C#, 图像处理, Windows Mobile; (I LOVE ZJU)</subtitle><id>http://feed.cnblogs.com/blog/u/25773/rss</id><updated>2012-02-01T02:58:44Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/25773/rss"/><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html</id><title type="text">ZOL1096 （Subway）和 ZOL1086（Octal Fractions）</title><summary type="text">本文讲解 ZOL 1096 和 ZOL 1086 的分析求解过程。其中ZOL 1096是一道关于地铁列车运行问题，给出四个参数（站点距离d，最大速度m，最大加速度a，最大加速度变化速度j），要求求出从一个站点到下一个站点的最短时间，通过数学和物理分析 v-t 曲线，从而得到 v-t 运行图的四种 case，然后给出结果。ZOL 1086 要求把 8 进制小数转换成 10 进制小数，但精度有所要求，因此引入一个数组来保存结果，另一个二维数组来保存二进制小数的基数，来得出满足题目要求精度的结果。</summary><published>2011-12-19T20:22:00Z</published><updated>2011-12-19T20:22:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html"/><content type="html">&lt;h1 style="text-align: center;"&gt;&lt;span style="font-size: 14pt;"&gt;（一）ZOL 1096：Subway&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;链接：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1096"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1096&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;题意：给出下列参数（所有参数均为小于等于1000的正整数），求地铁列车从一个站点到下一个站点之间的最短时间（精确到 0.1 秒）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;d&lt;/em&gt; - 地铁站之间的距离（米）;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;m&lt;/em&gt; - 列车的最大速度（米 / 秒）;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;a1&lt;/em&gt; - 最大加速度（绝对值）（米 / 秒^2);&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;j1&lt;/em&gt; - 最大 jerk （绝对值）（米 / 秒^3).&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;备注：最后一个条件中的 Jerk 就是加速度对时间的导数：d/dt (a); 相当于列车所受的合力对时间的变化率，该限制条件用于防止车厢内站立的乘客摔倒。&lt;/p&gt;&#xD;
&lt;p&gt;分析：此题的重点在于考察数学和物理基础，编程本身倒不重要。对这道题目，要求求列车运行的最短时间，显然，列车应该尽可能快的加速到最大速度，然后尽可能快的减速到停止。这个结论是很显然的。由于这是OnlineJudge 题目，所以我们也不必此结论做严格的数学证明。（如果不是这样，即列车没有尽可能快的加速，那么其 v- t 曲线就会位于最佳曲线的下方，为了保证面积相等，则其时间一定要超过最佳曲线）&lt;/p&gt;&#xD;
&lt;p&gt;可以绘制出列车运行的速度曲线 v = v( t )，根据物理知识，上诉条件相当于下列表达式：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;&amp;int; v dt = d;&lt;/span&gt; (列车走过的距离，即 v( t ) 曲线和横轴围成的面积)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;v &amp;le; m;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;| d(v)/dt | &amp;le; a1;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;| d^2(v)/dt^2 | &amp;le; j1&lt;/span&gt;;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据前面的假设，v(t) 在起始阶段一定是以最大的 j1 在加速。因此：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（1）全力加速： v(t) = 1/2 * j1 * t^2;&amp;nbsp; 曲线 v 为一段抛物线。设持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t1&lt;/strong&gt;&lt;/span&gt;；加速度 a = j1 * t;&lt;/p&gt;&#xD;
&lt;p&gt;（2）当到达t1时，假设此时达到了最大加速度 a1。然后保持加速度为 a1 不变，进入匀加速直线运动阶段，此时曲线 v 为斜率为 a1 的直线。加速度 a = a1；设持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t3&lt;/strong&gt;&lt;/span&gt;；&lt;/p&gt;&#xD;
&lt;p&gt;（3）在此速度上继续加速，但尽全力降低加速速度，直到最大速度 m。曲线 v 依然是抛物线，只是开口方向相反。持续时间依然为 t1；加速度 a = - j1 * ( t - t1 - t3);&lt;/p&gt;&#xD;
&lt;p&gt;（4）已最大速度 m 进入匀速直线运动。曲线 v 是水平线段，加速度 a = 0；设该段的持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t2&lt;/strong&gt;&lt;/span&gt;；&lt;/p&gt;&#xD;
&lt;p&gt;（5）全力减速，抛物线，和（3）对称，持续时间为 t1。&lt;/p&gt;&#xD;
&lt;p&gt;（6）以最大减速速度 -a1 进行匀减速直线运动，斜率为 -a1 的直线线段，和（2）对称，持续时间为 t3。&lt;/p&gt;&#xD;
&lt;p&gt;（7）继续全力减速，直到停止在下一个站点，和（1）对称，持续时间为 t1。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意上诉过程包含了 4 个含有参数 j1 的抛物线片段，先解释下 j1 的物理含义，假设列车运行在光滑轨道上，只受到一个牵引力，则在这些时间段上，牵引力变化的最快，加速度变化的最快（乘客最容易因为惯性发生摇晃）。物理量 Jerk 表示的是加速度变化的速度，根据牛顿第二定律，也就是物体所受合力的变化速度。举个例子，列车如果正在用最大牵引力进行全力加速，这时候乘客倾向于向后倾倒，乘客需要用很大力气紧紧抓住车厢内的扶手，为了让乘客保持稳定，这个牵引力不应该猛然撤去，而应该逐渐减小（相当于上面的曲线片段3），如果在全力加速时一瞬间撤去牵引力，乘客就会感觉很不稳定很不舒服（上海地铁中这种现象很常见，乘客应该有所体会，在列车加速时非常不稳，也就是列车受力的变化速度太快，即 j 太大了，很显然我想上海地铁应该是达不到本题目中要求的这么理想化的）。同理，如果列车在静止状态或者匀速状态，牵引力也应该逐渐加大，而不是一瞬间加到最大（这会对列车产生&amp;ldquo;猛推&amp;rdquo;效果，造成乘客在车厢内摇晃）。&lt;/p&gt;&#xD;
&lt;p&gt;最大加速度 a1 的物理含义表征的是牵引或者制动时的最大合力，不考虑刹车的话也就相当于发动机的最大输出牵引力（注：不是功率）。&lt;/p&gt;&#xD;
&lt;p&gt;上诉过程的速度 v（t）曲线如下图所示（注意：图形中的背景色表示的仅是片段的物理运动性质，但不代表相互衔接的曲线一定来自相同函数，下面的 case 图与此相同）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122007091638.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;很显然，曲线是关于垂直中心线轴对称的。求上诉曲线的积分即和 t 轴围成的面积很容易，抛物线由四个片段组成，它们能拼合成两个面积为 （m * t1）的矩形。斜率为 &amp;plusmn;a1 的匀加速直线运动部分，是两个梯形，它们也能拼合成一个面积为 （m * t3）的矩形。最后中间的匀速直线运动部分，是一个面积为（m * t2）的矩形。因此，对于上诉过程有：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;d = &amp;int; v dt = m * ( t1 * 2 + t3 + t2 );&lt;/span&gt;&amp;nbsp; &lt;span style="color: #008000;"&gt;// 两个站点之间的距离&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;min ( t ) = t1 * 4 + t3 * 2 + t2;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// 最短运行时间&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意：这是一种运动种类最多的&amp;ldquo;理想状况&amp;rdquo;，即距离 d 足够长，使得可以加速到最大速度 m； a1 要足够小，使得可以&amp;ldquo;割断&amp;rdquo;抛物线，出现斜线部分。实际上由于四个参数的值是任意给出的整数，这些参数可能只有一部分真正的对结果产生了限制作用，因此我们必须考虑下面的四种实际 case，如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122314564949.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;（1）case 1：受到距离 d 的限制，不受 m，a1 的限制。曲线只有四个抛物线片段。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据：&lt;span style="color: #800080;"&gt;&amp;int;&amp;nbsp;v dt&amp;nbsp;= max(v) * t1 * 2 =&amp;nbsp;(j1 * t1^2) * t1 * 2 = &amp;nbsp;d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 =&amp;nbsp; [ (d / 2 j1) ^ (1/3) ] * 4;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max(v) = j1 * t1^2 &amp;le; m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;max(a) = j1 * t1 &amp;le; a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　（2）case 2：受到最大速度 m 的限制，即能加速到最大速度m（此种情况可认为不受距离 d 的限制，当然也可以说 m 太小），同时也不受 a1 的限制。曲线由四个抛物线片段加一段水平线段组成。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据：&lt;span style="color: #800080;"&gt;1/2 * j * (t1 ^ 2) = m / 2;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;求出：&lt;span style="color: #800080;"&gt;t1 = sqrt (m / j1);&lt;/span&gt; 以及 &lt;span style="color: #800080;"&gt;t2 = (d - m * t1 * 2)/m;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t2;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;m * t1 * 2 &amp;le; d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;max(a) = j1 * t1 &amp;le; a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　（3）case 3：受到最大加速度 a1 的限制，同时受到距离 d 的限制，所以不能加速到最大速度 m （即不会受到最大速度 m 的限制）。曲线由四个抛物线片段加上两段斜率绝对值为 a1 的倾斜线段组成。则由下列方程：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;j1 * t1 = a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到 a1 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;max(v) = j1 * (t1^2) + a * t3;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;d = max(v) * (t1 * 2 + t3);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t3 * 2;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max(v) &amp;le; m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;t3 &amp;ge; 0;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（关于 t3 的负数解在后面讨论）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;整理上面的方程式，我们得到一个关于 t3 的一元二次方程如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;a1&lt;/em&gt; &lt;strong&gt;t3^2&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp; + &lt;em&gt;[ 3 (a1^2) / j1 ]&lt;/em&gt;&amp;nbsp; &lt;strong&gt;t3&lt;/strong&gt; + &lt;em&gt;[ 2 ( a1^3 ) / ( j1^2 ) - d ]&lt;/em&gt; = 0;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以根据一元二次方程的求根公式求出上面的 t3，解有两个，显然应该舍弃其中为负数的根，取正数根。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;【注意】这里 t3 的被舍弃的负数解的数学和物理意义是什么？&lt;/span&gt; 在给出代码后将继续讨论这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;（4）case 4：就是前面分析过的所有运动都包括。受到 a1 的限制因此有斜线段部分，受到 m 的限制因此有水平线段部分。但不受到距离 d 的限制（即能加速到最大速度）。有：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;j1 * t1 = a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;m = j1 * (t1^2) + a * t3;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;t2 = ( d - m * t1 * 2 - m * t3 ) / m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t3 * 2 + t2;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;case 4 需要满足的条件实际上不需要列出，因为如果前面的case都不满足条件，则一定会落入case 4。这里为了完备，我依然给出case 4需要满足的条件：&lt;/p&gt;&#xD;
&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max ( v ) / 2&amp;nbsp;= 1/2 * j1 * (t1^2) &amp;le; m/2;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（为了能达到最大加速度a1，要有足够的加速空间，因此 m 必须足够大）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;m * ( t1*2 + t3 ) &amp;le; d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（为了达到最大速度，必须有足够长的距离，因此 d 必须足够大）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #008000;"&gt;/***************************************************************/&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;好了，现在我们已经考虑了四种 case，有没有任何遗漏的 case （要注意如果有就意味着 WA！）？考虑下斜线段出现的条件是不是一定要达到最大加速度 a1？是的，因为如果没有达到最大加速度 a1 就进入某个斜率小于 a1 的斜线段，那么如果我们继续走抛物线（因为这时速度上还有继续加速的空间，而加速度还没有上升到最大值 a1，所以抛物线是可继续的），就能更快达到最大速度，因此最终使用的时间一定会更短（假设在某点有两条岔路，一条是高速公路，一条是坑坑洼洼的土路，它们都是可选的，你选哪一条？）！&lt;/p&gt;&#xD;
&lt;p&gt;总结：注意上面的所有条件中都有等于号，等于即表示 case 和 case 之间的临界点。上面的 case 的排序是根据编码实现比较方便的情况，从 case 1 可以比较容易演化到后续的 case（但其他 case 之间的演化，参数之间的相互作用要稍复杂一些），例如：处于 case1 时，如果把 m 水平线向下移动（减小 m），就会从 case1 转入 case2；如果把表示斜率的那条射线向水平方向的 t 轴方向转动（减小 a1 ），就会从 case1 转入 case3；或者把距离拉长（增大 d），则曲线将向上浮动，最大速度将增大，如果先遇到 m 限制，则从 case1 转入 case2，如果先遇到 a1 限制，则从 case1 转入 case3。如果前面的case不能符合条件，则最终一定会落入位于后面的case（这里我依然是基于我个人的编程经验和直观印象，最好应该更严谨一点）。case1是最特殊也是最简单的情况。最后的结果是一个四元函数（超过了比较容易直观理解的维度）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;min ( t ) = f (d, m, a1, j1);&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以想象根据上面的求解过程，它类似分段函数，在不同范围内是关于不同变量的函数。&lt;/p&gt;&#xD;
&lt;p&gt;最后我们对上诉 case 给出下列表格：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="background-color: #b0e0e6;" valign="center" width="60"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;CASES&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td style="background-color: #b0e0e6;" valign="center" width="140"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;起到限制作用的参数&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td style="background-color: #b0e0e6;" valign="center" width="280"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;运动组成&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td style="background-color: #b0e0e6;" valign="center" width="120"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;最短时间&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 1&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;d&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 2&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;m&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 水平线(匀速)&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t2&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 3&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;d, a1&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 斜线(匀加速)&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t3*2&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 4&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;m, a1&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="320"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 斜线(匀加速), 水平线(匀速)&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t3*2 + t2&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意参数 j1 的用法和其他三个参数不同，它是直接应用到抛物线函数中的参数，是唯一被直接使用的参数（其他三个参数主要起到限制作用），所有 case 都会包含四个抛物线片段，所以上表中 j1 不会在&amp;ldquo;起到限制作用的参数&amp;rdquo;中列出。前面已经提到过，这是基于直观印象的结果，我们尚未（也并无必要）从数学上去证明这一点。&lt;/p&gt;&#xD;
&lt;p&gt;最后给出该题目的代码，实际上就是从上诉推导过程直接翻译过来，代码本身没有任何难度。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('f0a21891-1c95-4f6d-9ae7-e903b38a176c')"&gt;&#xD;
&lt;div id="cnblogs_code_open_f0a21891-1c95-4f6d-9ae7-e903b38a176c" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; GetMinTime(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; d, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; m, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; t1, t2, t3;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 1: 受限于路程d。全程 O(t^2) 加速，只有抛物线的四个片段组成 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = pow(d*&lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;/j, &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/&lt;span style="color: #800080;"&gt;3.0&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j * t1 &amp;lt;= a &amp;amp;&amp;amp; j * t1 * t1 &amp;lt;= m)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 2: case 1 的基础加上 v = m 的匀速运动。可以加速到最大速度m。&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = sqrt(m*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j*t1 &amp;lt;= a &amp;amp;&amp;amp; m*t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt; &amp;lt;= d)&lt;br /&gt;    {&lt;br /&gt;        t2 = d*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/m - t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 3: 受限于最大加速度a。全称加速，不能加速到最大速度m &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 含有两段匀加速直线运动 O(t^2) and O(t) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; aa = a;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; bb = a*a*&lt;span style="color: #800080;"&gt;3.0&lt;/span&gt;/j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; cc = a*a*a*&lt;span style="color: #800080;"&gt;2.0&lt;/span&gt;/(j*j) - d;&lt;br /&gt;    &lt;br /&gt;    t3 = (sqrt(bb*bb - &lt;span style="color: #800080;"&gt;4&lt;/span&gt;*aa*cc) - bb)/(aa*&lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; vmax = a*a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j + a*t3;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; double s = vmax * (t1 * 2 + t3); &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t3 &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; vmax &amp;lt;= m)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t3 * &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 4: 受限于最大速度m。中途匀速 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t3 = m*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/a - a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j;&lt;br /&gt;    t2 = d*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/m - (t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt; + t3);&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 此处必定满足：t1&amp;gt;=0, t2&amp;gt;=0, t3&amp;gt;=0 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t3 * &lt;span style="color: #800080;"&gt;2&lt;/span&gt; + t2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; time;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; d, m, a, j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;d, &amp;amp;m, &amp;amp;a, &amp;amp;j) != EOF)&lt;br /&gt;    {&lt;br /&gt;        time = GetMinTime(d, m, a, j);&lt;br /&gt;        time = ((&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)(time*&lt;span style="color: #800080;"&gt;10&lt;/span&gt; + &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;)) * &lt;span style="color: #800080;"&gt;0.1&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/* 对 0.1 以下的小数四舍五入 */&lt;/span&gt;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.01f\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, time);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后，这道题目的序号是1096，位于第一个 problem sets 内，可以说排序是非常靠前的，但 AC 数量目前只有 172 ，提交数量只有 558，可见这些数据还是反映了其&amp;ldquo;难度&amp;rdquo;，但是难度主要在于数学和物理知识基础上，和编程本身，算法等技巧上倒是没有太大关系。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;【补充讨论】case3 中 t3 的负数解的数学意义。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在case 3中，求解 t3 的一元二次方程现在提出一个问题，为什么出现负数解，其数学和物理意义是什么，该方程是由 d，a1，j1 （不受到 m 的限制）组成的表达式为系数。由于方程的前两个系数必定为正数，因此其中的一个根一定是负数（如果存在解）。那么为什么存在负数解，它的意义是什么？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先，在数学上，列出该方程的前提是，t3 &amp;gt;=0，最终列车经过抛物线和匀加速直线运动，到达下一个站点。我们对 d，a1，j1 代入具体数值，构造出一正一负的两个解。参数是：&lt;/p&gt;&#xD;
&lt;p&gt;a1 = 2; j1 = 2; d = 12;&lt;/p&gt;&#xD;
&lt;p&gt;这时候抛物线部分是标准抛物线 y = x^2;&lt;/p&gt;&#xD;
&lt;p&gt;可以解出 t1 = 1;&lt;/p&gt;&#xD;
&lt;p&gt;关于 t3 的方程是 t3^2 + 3 * t3 - 4 = (t3 - 1) (t3 + 4) = 0; 因此 t3 = 1 或者 t3 = -4；&lt;/p&gt;&#xD;
&lt;p&gt;可以在数学上绘制出 t3 的这两个解的情况的 v-t 曲线，如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122022125787.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图中红色线条部分就是 t3 = -4 的情况。图中的红色箭头表示的是积分方向。因此可见上面的曲线积分中，抛物线（t1）和斜线段（t3）之间由于积分方向不同，存在一些相互抵销作用。从而最终能积到面积 d。这是 t3 的负数解在数学上的含义。但是在物理意义上这样是很难理解的，因为从抛物线片段后，出现了&amp;ldquo;负时间&amp;rdquo;，即时间倒流，最终列车停下来时是出发前 4 秒中。因为向着 t 轴负方向，所以 a = dv/dt 并未发生突变。而这种情况在物理意义上比较难以理解。&lt;/p&gt;&#xD;
&lt;p&gt;为了更好理解，换一种方式，把上图中的斜线段部分全部向 t 的正方向映射（由于做了镜面映射，dx = -dx' 所以对应线段上的积分方向同时会被改变），从而上图会演化成下面的图形：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122022225735.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上图中，如果把 t3 视作正数，则意味着加速度在每个衔接点处发生突变（即列车受到无穷大作用力，或者列车质量忽略不计，可看作没有质量没有惯性的质点），显然这也是超现实的。如果不考虑图中的积分方向，则曲线形成的面积显然比 d 大，因此图中标示出了积分方向，实际上两部分是相互抵销作用（斜线部分的积分是 24，抛物线部分的积分是 -12，因此最终两者累加结果是 d = 12）。&lt;/p&gt;&#xD;
&lt;p&gt;尽管 t3 的负数解在物理上没有令人满意的含义，但这就是满足 v 的积分 = d 的数学上的另一种可能情况。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;h1 style="text-align: center;"&gt;&lt;span style="font-size: 14pt;"&gt;（二）ZOL 1086： Octal Factions&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;链接：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1086"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1086&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;题意：给出一个八进制的小数，转换为 10 进制小数。输出格式是：0.d1d2d3 ... dk [8] = 0.D1D2D3 ... Dm [10]；&lt;/p&gt;&#xD;
&lt;p&gt;例如对八进制小数0.75，转换为10进制，输出格式：0.75 [8] = 0.953125 [10]。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;分析：整数的进制转换的方法非常简单，而这道题目是小数进制转换，把 8 进制转换到 10 进制的直接方法是：&lt;/p&gt;&#xD;
&lt;p&gt;Decimal = d1 * 8^(-1) + d2 * 8^(-2) + ... + dk * 8 ^(-k)&lt;/p&gt;&#xD;
&lt;p&gt;例如对 0.75 （8进制），十进制小数 = 7&amp;nbsp;/ 8 &amp;nbsp;+ 5 / 64 = 0.963125;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是仅仅从题目给出的样例输出来看，语言本身的内置数据类型 double 的精度可能已经不能满足要求了，因此这道题目看起来还是类似大数运算一类的题目，需要借助一个数组来存储数位。但是如果用上面的直接转换方法从 8 进制转换到 10 进制，用数组的方法，在编码实现上是很不方便的。所以考虑以 2 进制小数作为中介，即先把 8 进制转换到 2 进制小数，再转换到 10 进制。后面我们就能看到，这样我们就能很方便的利用数组来保存和给出具有任意精度（取决于数组大小，当然，如果追求更高精度也会引入少许时间和空间的代价）的结果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;把 8 进制小数转换到 2 进制小数的方法非常简单，只需要把8进制小数的每一位用三位二进制数表示即可，例如 0.75 [8] = 0.111 101 [2]; 设 d1 = (b1 b2 b3) [2],&amp;nbsp; d2 = (b4 b5 b6) [2]：&lt;/p&gt;&#xD;
&lt;p&gt;则对应的：0.d1 d2 d3 ... dk [8]&amp;nbsp;= 0.b1 b2 b3&amp;nbsp; b4 b5 b6&amp;nbsp; ...&amp;nbsp; b(3k) b(3k+1) b(3k+2) [2]&lt;/p&gt;&#xD;
&lt;p&gt;这是显然的，因为：d1 = b1 * 4 + b2 * 2 + b3，...&lt;/p&gt;&#xD;
&lt;p&gt;所以 d1 * 8^(-1) + d2 * 8^(-2) + ... + dk * 8 ^(-k) = (b1*4 + b2*2 + b3) / 8 + ... = b1/2 + b2/4 + b3/8 + ... = 0.b1b2b3b4...[2];&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再把这个二进制小数转换到 10 进制。为了精度需要，这里我引入一个数组：&lt;/p&gt;&#xD;
&lt;p&gt;unsigned char Dec[K];&amp;nbsp; // K 是一个常数，表征精度&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个数组的意义是，如果10进制小数是 0.D1D2D3 ... Dm [10]，则 Dec[i] = D(i+1); 最终的10进制小数将是这样：&lt;/p&gt;&#xD;
&lt;p&gt;0. Dec[0]&amp;nbsp; Dec[1]&amp;nbsp; Dec[2]&amp;nbsp; ...&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打印时只需要在前面加上&amp;ldquo;0.&amp;rdquo;前缀，然后从 0 索引开始依次输出其元素即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里必须注意到二进制小数的小数点后第 k 位的基数 (0.5 ^ k) 的一个很重要的特征，即 (0.5 ^ k) 的小数点后的位数个数是 k（之后将全部是 0）。例如：&lt;/p&gt;&#xD;
&lt;p&gt;0.5，0.25，0.125，0.0625，...&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意这个序列，b[ i + 1 ] = b[ i ] / 2; 由于末尾数永远是5，因此每一次除以 2 都会导致递增一位。因此引入另一个辅助存储空间，用于存储 2 进制小数的从小数点后第 1 位到第 K 位的基数（K 取决于需要的精度），显然这是一个矩阵，例如如果取 K&amp;nbsp;= 6，则定义矩阵 A ：&lt;/p&gt;&#xD;
&lt;p&gt;unsigned char A[6][8];&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经过初始化计算后，A 的内容如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0, 0,&amp;nbsp;0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[0]: 0.5&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[1]: 0.25&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;1, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[2]: 0.125&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 6, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[3]: 0.0625&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 3, 1, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[4]: 0.03125&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 1, 5, 6, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[5]: 0.015625&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;它的右上角元素全是0，应该算是一个下三角矩阵。其意义是 A[k] 是二进制小数第 k+1 位的基数，即 A[k] = 1/2^(k+1); 小数位长度是 Length (A[k]) = k+1;&lt;/p&gt;&#xD;
&lt;p&gt;这个矩阵类似做菜时事先准备的材料，在求解之前先计算好备用。&lt;/p&gt;&#xD;
&lt;p&gt;求解过程如下，首先把结果 Dec 数组全部清零，然后对 8 进制的小数的每一位小数，当作三位二进制数，如果对应的位为 1，就把该位的基数（ A[k] ）逐位累加到结果数组 Dec。最后我们在从后（远离小数点的那一侧）向前处理进位即可，这个过程称为规整，即大数算法中最后的步骤。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b3a5c7fe-4818-49bf-9758-b0c566460e96')"&gt;&#xD;
&lt;div id="cnblogs_code_open_b3a5c7fe-4818-49bf-9758-b0c566460e96" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 计算结果 0.N[0] N[1] ... &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Dec[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; A[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;][&lt;span style="color: #800080;"&gt;56&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A[k] = 1/( 2^(k+1) ) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A[k] 's digit length = (k + 1) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Init()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, carry = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    A[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;][&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;48&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; (i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;); j++)&lt;br /&gt;        {&lt;br /&gt;            A[i][j] = (A[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] + carry) / &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            carry = (A[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回 digit 数位长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Convert(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pOctNum)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 位索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; testNum[] = { &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt; };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, length = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, carry, digit;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* p = pOctNum + &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Ignore "0." &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    memset(Dec, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(Dec));&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        digit = *p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(digit &amp;amp; testNum[j])&lt;br /&gt;            {&lt;br /&gt;                length = index*&lt;span style="color: #800080;"&gt;3&lt;/span&gt; + j + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; length; i++)&lt;br /&gt;                    Dec[i] += A[index*&lt;span style="color: #800080;"&gt;3&lt;/span&gt; + j][i];&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        ++p;&lt;br /&gt;        ++index;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 归整数位 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = length; i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; --i)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Dec[i] &amp;gt; &lt;span style="color: #800080;"&gt;9&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            carry = Dec[i]/&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;            Dec[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] += carry; &lt;br /&gt;            Dec[i] = Dec[i] - carry * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; length;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; length, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];&lt;br /&gt;    Init();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL &amp;amp;&amp;amp; line[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        length = Convert(line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s [8] = 0.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; length; i++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Dec[i]);&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; [10]\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结：&lt;/p&gt;&#xD;
&lt;p&gt;（1）上面的方法，引入的辅助数据是二进制小数的基数，这是因为二进制小数在数位上只有 0 ，1 两种可能，这样实际上就是提供的结果就是，我们是否累加某一个基数到结果中。考虑如果我们用辅助空间存储的直接就是 8 进制小数的基础，则首先，我们要准备这样的基数的代码实现就比较麻烦（准备过程同样是大数除以一个小整数的大数运算！！）。另一点很不便的就是每个基数的小数的位长度和所在位之间没有直接的函数关系（而2进制小数的基数具有这样一个直接关系），我们还需要用对应的某一位上的数字去乘以这个基数再进行累加（而二进制小数的基数直接累加即可）。当然主要的麻烦在于第一点。第二点本来就位于大数算法中的过程之中，所以倒不显得困难。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（2）思考上面的累加过程然后规整数位，有一个累加进位的过程，但该过程是不可能使进位持续到整数部分的，即，假设一个小数的进制为 k ( k&amp;nbsp;&amp;gt;= 2 )，则如果小数点后每一位都是最大数字（k - 1），则这个小数在无限长循环下等于1。即：&lt;/p&gt;&#xD;
&lt;p&gt;1 = 0.99999...[10] = 0.11111...[2] = 0.77777...[8];&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;该小数为数列的求和：&lt;/p&gt;&#xD;
&lt;p&gt;f (n) = (k-1) * (k^-1 + k^-2 + ... k ^ -n) =&amp;nbsp;&amp;nbsp; (1 - k^-n) ;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;n 趋向无穷大时，lim f(n) = 1;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（3）题目中并没有明确指明或者暗示我们最终结果的精度，我们如果想要得到更高精度可以把数组取得更大，同时会增加内存需求。因此 K 的取值需要逐渐调整然后提交去&amp;ldquo;试验&amp;rdquo;。最初我取 K 值为 256，空间需求略大。最终代码中取 K = 48，结果就内存就已经降低到了ZOL上 C 语言的典型内存需求（120 KB左右）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #993366;"&gt;&lt;strong&gt;【注】&lt;/strong&gt;本文插图由&lt;/span&gt; &lt;a href="http://www.peda.com/grafeq/" target="_blank"&gt;GrafEq&lt;/a&gt;&lt;span style="color: #993366;"&gt;&amp;nbsp;和 Photoshop CS 共同绘制。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2294124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html</id><title type="text">有关进程空间，全局变量，静态变量</title><summary type="text">最近在一些回复中提到了一些静态变量，线程安全性，递归函数调用的问题。尽管大概情况我已经清楚，但感觉自己在某些细节方面还稍显模糊，因此在这个问题应该从底层上做一个重新的总结，把一些比较容易产生模糊的问题总结下。</summary><published>2011-11-23T15:13:00Z</published><updated>2011-11-23T15:13:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html"/><content type="html">&lt;p&gt;【创新性声明】本文没有本质上的创新性内容。属于一些实验和总结，有少量主观推测成分（有待进一步证实）。写这一类文章是非常危险的，因为有很多东西可能是我们不了解和比较模糊的，这很可能会出现错误的主观臆测，不仅仅是令明真相者贻笑大方的问题，更可怕的在于传播&amp;ldquo;错误&amp;rdquo;，这是我最为诚惶诚恐的一点。比如，我之前见到我指点过他的sun先生对于Photoshop中置换滤镜中的他的那些主观错误结论已经传遍网络，尽管可能没有太多人能关注到这个层面，但是我还是为这些错误的观点在网络上比比皆是而深感遗憾。正因为此，这篇文章我受限于个人水平，也不能100%确保自己不犯下认知性错误，因此此本（1）需要更专业的人的监督和意见，（2）可能随着我自己认知的变化而进行修订和变更。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最近在一些回复中提到了一些静态变量，线程安全性，递归函数调用的问题。尽管大概情况我已经清楚，但感觉自己在某些细节方面还稍显模糊，因此在这个问题应该从底层上做一个重新的总结，把一些比较容易产生模糊的问题总结下。&lt;/p&gt;&#xD;
&lt;p&gt;（1）全局变量，和静态变量位于进程空间什么位置。&lt;/p&gt;&#xD;
&lt;p&gt;为此，我用 VC6 新建了一个 Windows Console Application 。并输入代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c118aa03-6a43-4373-bf00-a74b67247570')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c118aa03-6a43-4373-bf00-a74b67247570" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;process.h&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;#include &amp;lt;tchar.h&amp;gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef HANDLE (WINAPI *FuncPtr)(&lt;br /&gt;    LPSECURITY_ATTRIBUTES lpThreadAttributes,&lt;br /&gt;    SIZE_T dwStackSize,&lt;br /&gt;    LPTHREAD_START_ROUTINE lpStartAddress,&lt;br /&gt;    LPVOID lpParameter,&lt;br /&gt;    DWORD dwCreationFlags,&lt;br /&gt;    LPDWORD lpThreadId&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; TestClass&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    TestClass()&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestClass's constructor.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    ~TestClass()&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestClass's destructor.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;TestClass g_class;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp1 = &lt;span style="color: #800080;"&gt;0x11223344&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp2;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Array[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp3;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;The default size for the reserved and initially committed stack memory &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;is specified in the executable file header. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;DWORD WINAPI threadProc(LPVOID lpParameter)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; threadIndex = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)lpParameter;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: auto variable on new thread's stack (thread: %d)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;a, threadIndex);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic1 = &lt;span style="color: #800080;"&gt;0x12345678&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic2 = &lt;span style="color: #800080;"&gt;0x00abcdef&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic3;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = g_Temp1 &amp;amp; &lt;span style="color: #800080;"&gt;0xffff&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pConstData = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello World&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pConstData[1] = 0; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存访问冲突（不可写）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pHeap1 = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*)malloc(&lt;span style="color: #800080;"&gt;32&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pHeap2 = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*)malloc(&lt;span style="color: #800080;"&gt;32&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---enter main----\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    HMODULE hModule = GetModuleHandle(_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Kernel32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: Module (Kernel32.dll)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hModule);&lt;br /&gt;&lt;br /&gt;    FuncPtr pFunc = CreateThread;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: FuncPtr (CreateThread)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pFunc);&lt;br /&gt;    &lt;br /&gt;    DWORD tid1, tid2;&lt;br /&gt;    HANDLE hThread1 = CreateThread(NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, threadProc, (LPVOID)&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, CREATE_SUSPENDED, &amp;amp;tid1);&lt;br /&gt;    HANDLE hThread2 = CreateThread(NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, threadProc, (LPVOID)&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, CREATE_SUSPENDED, &amp;amp;tid2);&lt;br /&gt;    &lt;br /&gt;    ResumeThread(hThread1);&lt;br /&gt;    WaitForSingleObject(hThread1, &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;    CloseHandle(hThread1);&lt;br /&gt;    ResumeThread(hThread2);&lt;br /&gt;    WaitForSingleObject(hThread2, &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;    CloseHandle(hThread2);&lt;br /&gt;    &lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: auto variable on main thread's stack\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;a);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: memory alloc on heap: pHeap1 (32 bytes)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pHeap1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: memory alloc on heap: pHeap2 (32 bytes)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pHeap2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: address of const data(\"hello world\")\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pConstData);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp1 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp2 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Array (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, g_Array);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp3 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp3);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic1 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic2 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic3 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic3);&lt;br /&gt;    free(pHeap1);&lt;br /&gt;    free(pHeap2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---leave main----\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这个例子里我添加了全局变量，auto 类型的栈上临时变量，函数内的静态变量，以及新创建的线程的栈上的变量等。此程序产生的输入如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('006317b9-1b68-4fa9-98cc-bb9125d45ac3')"&gt;&#xD;
&lt;div id="cnblogs_code_open_006317b9-1b68-4fa9-98cc-bb9125d45ac3" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; TestClass&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s constructor.&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; ---enter main----&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; 7C800000: Module (Kernel32.dll)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; 7C810647: FuncPtr (CreateThread)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; 0052FFB0: auto variable on &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack (thread: 1)&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; 0062FFB0: auto variable on &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack (thread: 2)&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; 0012FF7C: auto variable on main thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; 00370FE0: memory alloc on heap: pHeap1 (&lt;span style="color: #800080;"&gt;32&lt;/span&gt; bytes)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #800080;"&gt;00371038&lt;/span&gt;: memory alloc on heap: pHeap2 (&lt;span style="color: #800080;"&gt;32&lt;/span&gt; bytes)&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #800080;"&gt;00423148&lt;/span&gt;: address of &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; data(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello world&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; 00425B40: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp1 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; 00428D78: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp2 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; 00428D68: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Array (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; 00428D64: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp3 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; 00425B44: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic1 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; 00425B48: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic2 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; 00428D60: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic3 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; ---leave main----&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; TestClass&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s destructor.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们可以看到一个类的实例作为全局变量，它的构造函数在进入入口点函数（main）之前被调用，在main函数之后被析构。这显示这个过程应该是包装在main函数外层的函数，也就是 CRT 做的。&lt;/p&gt;&#xD;
&lt;p&gt;上面的输出给出了各个变量在进程空间中的地址（虚拟内存地址），因此我们再对照一下编译后的PE文件的 SectionHeader 的信息，使用我编写的文件格式查看器打开编译后的EXE文件，如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011112319222023.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据PE文件中的信息:&lt;/p&gt;&#xD;
&lt;p&gt;ImageBase = 0x0040 0000;&lt;/p&gt;&#xD;
&lt;p&gt;SectionAlignment = 0x1000;&lt;/p&gt;&#xD;
&lt;p&gt;FileAlignment = 0x1000;&lt;/p&gt;&#xD;
&lt;p&gt;可以根据 section header 的信息知道，各个段在进程空间中的地址是（对比程序输出，可知全局变量和常量字符串在那个段范围内）:&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;section&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;From&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;To&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Characteristics&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.text&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00421790&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00422790&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可执行，可读&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;代码段&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.rdata&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00423000&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00424777&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;初始化数据段（常量）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.data&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00425000&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042A730&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可写&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;初始化数据段（全局和静态变量）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.idata&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042B000&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042B7CC&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可写&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="64"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.reloc&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042C000&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042CEC9&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="104"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可丢弃&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="249"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;基址重定位&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上表是根据PE文件中的信息给出了进程空间中各个段的地址范围。因此我们根据运行时的输出情况，可以很容易的确定哪些变量具体位于进程空间的那个段中。例如针对这个具体的实例来说，全局变量和函数内静态变量位于 .data 段，常量字符串位于 .rdata 。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;注意由于 SectionAlignment 和 FileAlignment 是相同的，因此文件中的内容和映射后，节之间的相对位置是没有变化的。节的特性被设置给内存页，因此如果代码中试图对内存执行没有权限的操作，例如对常量字符串的地址进行写入，系统就会告知错误。可以看到 section 的起始地址使用 sectionAlignment （默认 0x1000）对齐。数据段默认不具有共享属性，被映射以后数据是该进程空间所私有的。但共享的段则在所有进程实例中共享。可以设定某个段为共享，当使用一个DLL时，则数据通过DLL来给所有进程共享，共享意味着在所有进程空间中，该段被映射到相同的物理内存页。例如《windows 核心编程》中有一个例子，当创建多个进程实例，对话框上能实时更新的显示出当前实例的个数。（同时这也是作为用于控制只能运行一个进程实例的方法之一）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Tell the compiler to put this initialized variable in its own Shared &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; section so it is shared by all instances of this application.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; data_seg("Shared")&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; LONG g_lApplicationInstances = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; data_seg()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Tell the linker to make the Shared section readable, writable, and shared.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; comment(linker, "/Section:Shared,RWS")&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以看出常量字符串代码中的"Hello World&amp;rdquo;位于.rdata节，该节是不可写的。全局变量和静态变量都位于.data节，可读可写。代码中已初始化的数据在节内位于靠近节前部地址较低的地方，未初始化的数据靠地址较高的地方。对于程序中的基本类型变量例如整形等，实际上它们从文件中被读入内存后就已具有了初值，相当于完成了初始化。但对于一个类的实例来说，对其初始化需要调用其构造函数。这些都需要在进入入口点函数之前完成。&lt;/p&gt;&#xD;
&lt;p&gt;因此现在我们可以明确：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;char str[] = "Hello World";&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;含义是 str 数组是位于栈上的数组，然后从初始化段（只读）拷贝字符串内容到栈上的数组。（编译器可能对其用 DWORD 进行拷贝）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;char *str = "Hello World";&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;str 是位于栈上的一个指针，指向初始化段的只读数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;初学者一般不太容易立即区分出上面的代码在底层上的区别：前者是栈上的数组，数组空间在栈上分配。编译器会插入代码，在运行时把数据从只读数据段拷贝到栈上空间。所以前者的 str 是可写的。后者是栈上的一个指针变量，指向只读数据段上的某个位置（在C++里面这样的赋值合法，是为了照顾成千上万的已有 C 代码）。后者的 str 是不可写的。如果试图修改它，在编译上是通过的，但运行时属于不确定行为。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我先后创建两个新的线程，是为了观察新线程的栈的位置，可以看到在这个例子中，在创建时我没有指定栈的大小，默认是 1MB。从低地址往高地址数，主线程的栈在进程空间中相当靠前，（中间的空隙属于堆），然后是那些 sections，然后此处剩下很大的一段空隙又基本上全部是属于堆。然后是新创建的线程的栈（默认 1MB），它们的地址看起来已经相当高。然后是那些被影射进来的DLL，系统 DLL 都经过了 Rebase，一般位于比较高地址的地方（靠近 2GB 边界），最后是系统控制的空间边界（0x80000000）。当然，默认情况下，是程序员和系统各占 4GB 空间的一半，但可以通过启动的配置参数让程序员负责的空间达到 3GB。因此上面的范例的进程空间大体如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011112321383221.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当然这个图只是针对这个控制台程序例子的特例而绘制，只是给出该例子中进程空间的示意图。图中箭头表示的是栈的增长方向。当一个进程中运行多个线程时，它们各自拥有独立的栈。当然这些栈之间由于位于相同的地址空间，所以它们彼此是可见的。因此一个线程可以把自己的栈上地址传递给其他线程进行处理，但这种地址随着线程退出就会失效，因此必须做线程同步，即阻塞式等待。例如不能使用 PostMessage 传递栈上的地址给其他窗口的窗口过程，而使用 SendMessage 是可行的。&lt;/p&gt;&#xD;
&lt;p&gt;当我们提到并发性和多线程安全，通常在针对一个函数讲时，是进程空间内的多个线程同时调用该函数是否会引发问题。并发还指多个线程对同一资源的访问和使用，例如数据库，文件等。如果一个函数是可重入的，则它不能直接或简介的使用，引用静态，全局性变量（尤其是对这些共享性变量的读写不是原子性的，且这些变量的值的准确性如果对于使用者来说是关键的状态性数据，则会引入诸如&amp;ldquo;脏读&amp;rdquo;等问题），也不能直接或简介调用不可重入的函数。栈上的一个 auto 类型变量是多线程安全的，是因为栈是属于线程的，彼此独立，因此 auto 类型变量对于线程来说相当于&amp;ldquo;私有数据&amp;rdquo;。对于递归函数，每一层递推都会在栈上增加一层 stackframe，因此函数内的临时变量位于其各自调用所属的 stackframe 中，也相当于彼此独立。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（2）系统调度，消息队列的基本单位。&lt;/p&gt;&#xD;
&lt;p&gt;这里我们提及的是进程和线程，不再考虑线程以下的概念。考虑下面的问题：&lt;/p&gt;&#xD;
&lt;p&gt;2.1 拥有消息队列的基本单位是什么？A。窗口；B。线程。&lt;/p&gt;&#xD;
&lt;p&gt;答案是线程。但通常我们更容易把消息队列和窗口关联在一起，这仅仅是因为事件驱动给我们的一种主观表象。由于调度的基本单位是线程，因此处理消息和拥有消息队列的基本单位也是线程。系统派送消息的目标，是把消息送到创建窗口的线程所拥有的消息队列。然后该线程被调度得到时间片，由消息循环（DispatchMessage）间接调用该窗口的窗口过程函数。但一个线程不一定拥有消息队列，例如只专注于运算不负责接受消息控制的后台线程，只有线程调用 PeekMessage，GetMessage 一类的函数时，系统才会为这个线程创建消息队列。拥有消息队列的线程也不一定会创建窗口，但是创建窗口的线程就会接收到和窗口有关的各种消息。&lt;/p&gt;&#xD;
&lt;p&gt;总结一下，线程中根据其功能又可以大致的分为主线程（或者在GUI程序中通俗的理解为 UI 线程）和后台线程。消息中的一部分属于窗口消息，这些消息是和一个具体的窗口关联并以创建该窗口的线程的消息队列作为目标的（最终线程的消息循环负责引发对窗口过程的调用，即 DispatchMessage），但并不是所有的消息都会和具体窗口关联。例如普通的线程消息（而一个线程也可能不会创建任何窗口）。窗口消息中的一部分又可以属于对话框消息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.2 比较特殊的几个消息：WM_MOUSEMOVE, WM_TIMER, WM_PAINT, WM_QUIT; (待完成）&lt;/p&gt;&#xD;
&lt;p&gt;线程消息分为三种类型：incoming sent message; posted message; input message; 在标准术语里面，第一种被称为非队列消息，后两种称为队列消息，也就是被理解为&amp;ldquo;位于消息队列中的消息&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（1）《程序员的自我修养》，俞甲子 等。&lt;/p&gt;&#xD;
&lt;p&gt;（2）&amp;ldquo;Billy Belceb 病毒教程Win32篇&amp;rdquo;（选自《看雪学院五周年纪念收藏版》）, Billy Belceb。&lt;/p&gt;&#xD;
&lt;p&gt;（3）《windows核心编程》, Jeffery Richer.&lt;/p&gt;&#xD;
&lt;p&gt;（4）《Tho Old New Things》, Raymond Chen.&lt;/p&gt;&#xD;
&lt;p&gt;（5）《The C++ Programming Language》，BS。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;　　　　&lt;span style="font-size: 12px;"&gt;【补充说明】&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;　　　　本文已有的评论，因为涉及到有具体所指的个人主观性意见，于技术探讨交流上没有任何积极意义，因此不在技术博客保留，已转移到163博客的以下地址进行备份性保留（可以点击以下地址观看原有评论）：&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px; color: #ff0000;"&gt;&lt;strong&gt;　　　　&lt;a href="http://blog.163.com/jinfd@126/blog/static/62332277201211104431759/"&gt;http://blog.163.com/jinfd@126/blog/static/62332277201211104431759/&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;　　　　我欢迎一切针对技术本身的意见和负面批评，并对所有评论进行保留，但以上内容不包括和技术无关的主题（例如无实质内容的评论，明显针对人的主观评价等）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;　　　　--hoodlum1980，2012年2月1日。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2260932.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html</id><title type="text">ZOL 简单题集合（三）</title><summary type="text">ZOL 简单题目集合之三</summary><published>2011-11-18T12:17:00Z</published><updated>2011-11-18T12:17:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html"/><content type="html">&lt;p&gt;（1）ZOL1045. HangOver (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1045"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1045&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在桌子边码扑克牌，给出表示扑克牌延伸出桌子的距离的浮点数，问需要多少张牌。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('2848f7d8-c838-4943-8949-3cf1b1fc49d6')"&gt;&#xD;
&lt;div id="cnblogs_code_open_2848f7d8-c838-4943-8949-3cf1b1fc49d6" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetCardCount(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; dx = &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(dx &amp;lt; c)&lt;br /&gt;    {&lt;br /&gt;        result++;&lt;br /&gt;        dx += &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/(result + &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; c;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;c);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;lt; &lt;span style="color: #800080;"&gt;0.001&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        result = GetCardCount(c);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d card(s)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, result);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（2）ZOL1061. Web Navigation (0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1061"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1061&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;模拟浏览器的前进后退功能，给出初始时刻的当前页面，然后经过一系列命令：访问某个url，前进，后退，如果命令有效，输出当前页面。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('467ec50e-b149-45bc-8fe2-65d4d90c86b5')"&gt;&#xD;
&lt;div id="cnblogs_code_open_467ec50e-b149-45bc-8fe2-65d4d90c86b5" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; sForw[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;72&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pForw;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; sBack[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;72&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pBack;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; curUrl[&lt;span style="color: #800080;"&gt;72&lt;/span&gt;], line[&lt;span style="color: #800080;"&gt;96&lt;/span&gt;];&lt;br /&gt;    &lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case和case之间的空行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         gets(line);&lt;br /&gt;        strcpy(curUrl, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.acm.org/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        pForw = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        pBack = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BACK&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the backward stack is empty, the command is ignored.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pBack &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ignored\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the forward stack.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    ++pForw;&lt;br /&gt;                    strcpy(sForw[pForw], curUrl);&lt;br /&gt;                    &lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Pop the page from the top of the backward stack, &lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;making it the new current page.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    strcpy(curUrl, sBack[pBack]);&lt;br /&gt;                    --pBack;&lt;br /&gt;&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FORWARD&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the forward stack is empty, the command is ignored.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pForw &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ignored\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the backward stack. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    ++pBack;&lt;br /&gt;                    strcpy(sBack[pBack], curUrl);&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Pop the page from the top of the forward stack, &lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;making it the new current page.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    strcpy(curUrl, sForw[pForw]);&lt;br /&gt;                    --pForw;&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strncmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;VISIT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the backward stack, &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                ++pBack;&lt;br /&gt;                strcpy(sBack[pBack], curUrl);&lt;br /&gt;                &lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;and, make the URL specified the new current page. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                strcpy(curUrl, line + &lt;span style="color: #800080;"&gt;6&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;The forward stack is emptied.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                pForw = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;QUIT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case 和 case 之间用空行隔开&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注意这个if条件，如果没有，则导致PE！（多打印一个空行）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; n - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（3）ZOL1067. Color Me Less (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1067"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1067&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出16个RGB值作为关键颜色，对后续给出的颜色，要求用欧几里德距离最短的方式，被映射到哪个关键颜色上。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('4a401ca5-1e14-4390-856f-7a33500ae818')"&gt;&#xD;
&lt;div id="cnblogs_code_open_4a401ca5-1e14-4390-856f-7a33500ae818" &gt;&#xD;
&lt;pre&gt;include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagColor&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; r;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b;&lt;br /&gt;} Color;&lt;br /&gt;&lt;br /&gt;Color colors[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetMappedIndex(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; r, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&lt;br /&gt;{&lt;br /&gt;    unsigned &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; distance = &lt;span style="color: #800080;"&gt;0xFFFFFFFF&lt;/span&gt;;&lt;br /&gt;    unsigned &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; temp;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, index = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        temp = (r-colors[i].r) * (r-colors[i].r);&lt;br /&gt;        temp += (g-colors[i].g) * (g-colors[i].g);&lt;br /&gt;        temp += (b-colors[i].b) * (b-colors[i].b);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(temp &amp;lt; distance)&lt;br /&gt;        {&lt;br /&gt;            distance = temp;&lt;br /&gt;            index = i;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; index;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, r, g, b;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;br /&gt;            &amp;amp;colors[i].r, &amp;amp;colors[i].g, &amp;amp;colors[i].b);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;r, &amp;amp;g, &amp;amp;b);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(r == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        i = GetMappedIndex(r, g, b);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(%d,%d,%d) maps to (%d,%d,%d)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;            r, g, b, colors[i].r, colors[i].g, colors[i].b);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（4）ZOL1123. Triangle Encapsulation（0.5）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1123"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1123&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;依次给出一个三角形按逆时针方向排列的三个顶点的坐标（所有坐标范围在 -9 ~ 9 之间），要求求平面上被这个三角形完全围在内部的所有整数坐标的点。而且这道题目对输出格式有特别要求，不好描述，就是输出的点排列的就像他们在笛卡尔座标中的位置那样。&lt;/p&gt;&#xD;
&lt;p&gt;解法：首先这道题目求解一个点是否在三角形，可以用常规的点在多边形内的射线法。但还可以用线段旋转方向（即叉积）来判断，如果点P在三角形ABC内部，则AB，BC，CA旋转到P的时针方向必然全都相同。如果在外部，则必定不满足这个条件。而且此题还明确说明，三个点ABC是逆时针排列的，所以三条边从逆时针转过去，转到P点如果都是&amp;ldquo;右转&amp;rdquo;，则说明点P在三角形内。如果P在三角形的边上，叉积为0。因此只要遍历三角形的外接矩形内的所有整数坐标点，依次判断即可。最后为了按题目要求的格式进行输出，采用一个辅助队列缓存所有解，最后得到了最左侧的点的位置以后，所有解的打印位置也就确定了。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('75193afa-995e-4f30-997a-677585a99128')"&gt;&#xD;
&lt;div id="cnblogs_code_open_75193afa-995e-4f30-997a-677585a99128" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#ifndef __min&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __min(a, b) ((a)&amp;lt;(b)? (a):(b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#ifndef __max&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __max(a, b) ((a)&amp;gt;(b)? (a):(b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagPOINT&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; x;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; y;&lt;br /&gt;} POINT;&lt;br /&gt;&lt;br /&gt;POINT pts[&lt;span style="color: #800080;"&gt;90&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pts_top; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Queue 指针&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; (Pi-&amp;gt;Pk) * (Pi-&amp;gt;Pj) 从 PI-PK 转向 PI-PJ 的方向&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &amp;gt; 0: 左转&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &amp;lt; 0: 右转&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; = 0: 共线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Direction(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yi,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yj,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yk)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (xk-xi)*(yj-yi) - (xj-xi)*(yk-yi);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;三角形的三个顶点（逆时针方向）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x0, y0, x1, y1, x2, y2, x, y;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, top, right, bottom;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; min_x, i, j, cur_y;&lt;br /&gt;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Program 4 by team X\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d %d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;        &amp;amp;x0, &amp;amp;y0, &amp;amp;x1, &amp;amp;y1, &amp;amp;x2, &amp;amp;y2) != EOF)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化case&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        pts_top = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        min_x  = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        left = __min(__min(x0, x1), x2);&lt;br /&gt;        top = __max(__max(y0, y1), y2);&lt;br /&gt;        right = __max(__max(x0, x1), x2);&lt;br /&gt;        bottom = __min(__min(y0, y1), y2);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在矩形整数阵列中搜寻三角形内部的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(y = top; y &amp;gt;= bottom; y--)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(x = left; x &amp;lt;= right; x++)&lt;br /&gt;            {&lt;br /&gt;                if( Direction(x0, y0, x1, y1, x, y) &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                if( Direction(x1, y1, x2, y2, x, y) &amp;lt;= 0) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                if( Direction(x2, y2, x0, y0, x, y) &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这是一个内部的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   ++pts_top;&lt;br /&gt;                pts[pts_top].x = x;&lt;br /&gt;                pts[pts_top].y = y;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;更新最左的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x &amp;lt; min_x) min_x = x;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打印输出结果！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         cur_y = -&lt;span style="color: #800080;"&gt;10&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前y坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt;= pts_top; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;换行了?&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pts[i].y != cur_y) &lt;br /&gt;            {&lt;br /&gt;                cur_y = pts[i].y;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;不是第一行，则换行！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;本行前面的前导打印多少个空格？&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; ( pts[i].x - min_x ) * &lt;span style="color: #800080;"&gt;9&lt;/span&gt;; j++)&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;没有换行，则在两个点之间打印一个空格&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(%2d, %2d)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pts[i].x, pts[i].y);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case结束后还需要输出一个空行！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;End of program 4 by team X\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（5）ZOL1244. Definite Values (0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1244"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1244&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最开始只有变量 a 有确定值，执行一系列赋值语句后，要求按字典顺序，输出所有有确定值的变量。如果任何变量都没有确定值，输出 none 。但这个题题目里没有明确的说清楚，就是所有变量名都是单字母，有了这个假设这个题目其实非常简单。但如果我们不考虑这一点，而是变量名任意，那显然还要建立符号表，又要变得更麻烦。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('37e4dc1d-6b2e-4886-91cf-4879b788795d')"&gt;&#xD;
&lt;div id="cnblogs_code_open_37e4dc1d-6b2e-4886-91cf-4879b788795d" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; variables[&lt;span style="color: #800080;"&gt;26&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, nCase = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, charCount;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        getchar(); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 取走回车符号 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        ++nCase;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Init: a is definite. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        variables[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;26&lt;/span&gt;; i++)&lt;br /&gt;            variables[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            variables[line[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;] = variables[line[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;]-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Program #%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, nCase);&lt;br /&gt;        charCount = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;26&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(variables[i] &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                line[charCount] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + i;&lt;br /&gt;                charCount++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(charCount &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; charCount; i++)&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;            }&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;none\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（6）ZOL1858. Soundex (0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1858"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1858&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;把单词按照发音归类，给出一个单词的拼写，按照规则求出这个单词的一个发音归类代码。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c9cf36f9-275c-4fbd-aa69-5c9762f75bc3')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c9cf36f9-275c-4fbd-aa69-5c9762f75bc3" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetSoundexCode(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* buf, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* word)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; last_code = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, cur_code;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* strs[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] = { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BFPV&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CGJKQSXZ&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;L&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MN&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;R&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pDest = buf;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pSrc = word;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*pSrc)&lt;br /&gt;    {&lt;br /&gt;        cur_code = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strchr(strs[i], *pSrc) != NULL)&lt;br /&gt;            {&lt;br /&gt;                cur_code = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + i;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(last_code != cur_code &amp;amp;&amp;amp; cur_code &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            *pDest = cur_code;&lt;br /&gt;            ++pDest;    &lt;br /&gt;        }&lt;br /&gt;        last_code = cur_code;&lt;br /&gt;        ++pSrc;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator!&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    *pDest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;], code[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL)&lt;br /&gt;    {&lt;br /&gt;        GetSoundexCode(code, line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, code);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;备注：题目后面括号内的数字为我的主观认定难度值。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2254606.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html</id><title type="text">[发布] QQGame 连连看辅助工具（限制功能版）</title><summary type="text">前几天想起了这个想法，然后最近两天开发了这个工具，就是用于 QQGame 中的连连看的辅助工具。本来是想把全部代码都公开的，但是我在调试程序的时候注意到腾讯在qqgame中宣传卖那些游戏道具。所以我的想法就改变了下，不想影响腾讯卖这些道具来赚钱，所以我把原来完整功能版的版本又加上了一些限制。</summary><published>2011-11-18T11:12:00Z</published><updated>2011-11-18T11:12:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html"/><content type="html">&lt;p&gt;前几天想起了这个想法，然后最近两天开发了这个工具，就是用于 QQGame 中的连连看的辅助工具。本来是想把全部代码都公开的，但是我在调试程序的时候注意到腾讯在qqgame中宣传卖那些游戏道具。所以我的想法就改变了下，不想影响腾讯卖这些道具来赚钱，所以我把原来完整功能版的版本又加上了一些限制。&lt;/p&gt;&#xD;
&lt;p&gt;辅助工具实现的功能包括：全自动点击，自动重排（当方块无解时），显示可点击方块提示（相当于官方的指南针功能），模拟单步点击。&lt;/p&gt;&#xD;
&lt;p&gt;首先进入 QQGame，连连看，开始游戏后如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818261085.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;启动工具后的界面如下图所示，点击任务栏按钮即可。具体用法参考任务栏的tooltip和压缩包中的简要说明。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818284472.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后我为这个版本加了以下限制，使他不至于惹上&amp;ldquo;影响别人赚钱&amp;rdquo;的嫌疑（虽然我一向非常鄙视腾讯）。主要限制如下：&lt;/p&gt;&#xD;
&lt;p&gt;（1）自动点击的速度限制在 1 秒一次点击，但可以暂时体验 500 ms 速度。更快的点击速度全部被禁用！&lt;br /&gt;　　　　（2）提示数量超过16个（相当于道具中的指南针）时，每次需要输入验证码才能继续。&lt;br /&gt;　　　　（3）快速连击&amp;ldquo;消掉一对方块&amp;rdquo;的次数如果超过10次，则需要输入验证码才能继续。此处快速连击是指两次点击时间间隔小于 1 秒。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;作为兴趣，验证码对话框是我今天加上去的，显然这个手段也是我和腾讯学习来的，如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818344023.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个对话框比较简单，我用代码动态生成一个图片显示在上面，当然题目也是动态生成的，题目主要是 100 以内的加减乘除法。图片中我放了随机的贝塞尔彩色线条作为干扰。问题里面的每个字符采用了位置和角度的轻微抖动，但是没有经过变形，因为我是用 GDI 函数绘制的文本。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面介绍下这个辅助工具的一些内容，首先我寻找到游戏中的窗口后，需要确定的棋盘网格的内容，最早我的想法是用4到5个关键点采样来检测方块。但是后来我实际开发时发现，比较幸运的是，能选取特定的方块坐标，可以仅仅用一个采样点就能区分出所有方块。满足这样高区分度条件的采样点一共有四个，被我用代码寻找了出来。检测方块时，相比之前的&amp;ldquo;快速美女找茬&amp;rdquo;工具，这次我用了效率更高些的直接对位图数据块寻址来检测。当然，这要求对位图中的像素定位（即在内存数据块中定位到某个位置的某个通道）需要非常熟悉，我在自己的博客中介绍过多次，这里就不重复了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;确定了棋盘网格的内容后，就是这个工具的核心，即寻解的方法。从这点上来说，其实程序的寻解和人的寻解本质上并没有什么不同，只不过两者的侧重点稍有区别。在程序中，在确定棋盘网格的过程中，我就建立了对每一种方块都建立了一个双向链表（采用双向链表的原因是因为随着寻解的过程，需要频繁的进行节点脱链操作），去存储他们的坐标。这样的目的是不需要反复的盲目扫描棋盘，而是把精力集中到判断两个方块是否有通路就可以了。游戏中的方块多达 40 多种，所以我用一个指针数组来存储所有链表的 Head。取决于游戏的设计，链表数量较多，但长度较短（例如为 4 ）。所以尽管寻解算法的时间复杂度相对与链表长度为 O(n^2)，但整个求解过程依然是感觉很快，后台运算的线程感觉是瞬间就退出的，以至于我觉得哪怕是用户需要的时候再算时间都来得及，根本不需要另起一个线程来求解了。当完全不使用定时器延时时，令我感到吃惊的是，仿佛是就点了一下，然后所有方块就全部消失的无影无踪了，这根本违背了我们平时观看到的场景印象。由于方块消失的太快，整个游戏窗口都弥漫在一团烟雾效果中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面我给出的是连连看的&amp;ldquo;通路&amp;rdquo;判断方法，这是所有连连看的共同游戏规则。不管是什么连连看游戏，你都能在代码中看到这个函数，只不过可能形式有多种多样而已。由于分别在两个方向上检测，所以两部分的代码惊人的一致，这也可能让我这样有完美主义倾向的人感觉不爽，想把两部分代码合并成一个循环（我们把网格指针的偏移作为变量，分别存放到一个含有两个元素的数组中即可，例如如果我们要在水平方向上移动，偏移量是+-1，在垂直方向上移动，偏移量是+-行宽度），这当然是可以的，但我想可能会牺牲掉一部分代码可读性。下面的代码非常简洁，它的主题是来自我以前发表在 BCCN上 的 TC2.0版的连连看（DOS贴图版）中的代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('a0ebba97-b70e-470b-ad3c-b27095452a57')"&gt;&#xD;
&lt;div id="cnblogs_code_open_a0ebba97-b70e-470b-ad3c-b27095452a57" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;连连看游戏的核心算法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;BOOL CanConnect(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;11&lt;/span&gt;][&lt;span style="color: #800080;"&gt;19&lt;/span&gt;], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row1, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col1, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row2, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; path, i, j, left, right, top, bottom;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; min1, min2, max1, max2;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;-----------------查找水平方向----------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    min1 = max1 = col1;&lt;br /&gt;    min2 = max2 = col2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[row1][min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min1--;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[row2][min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min2--;&lt;br /&gt;    left = __max(min1, min2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;19&lt;/span&gt; &amp;amp;&amp;amp; map[row1][max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max1++;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;19&lt;/span&gt; &amp;amp;&amp;amp; map[row2][max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max2++;&lt;br /&gt;    right = __min(max1, max2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;检查两条水平线之间是否有可连通的垂直线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt;= right; i++)&lt;br /&gt;    {&lt;br /&gt;        path = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = __min(row1, row2) + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt; __max(row1, row2); j++)&lt;br /&gt;        {&lt;br /&gt;            path += map[j][i];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;-----------------查找垂直方向----------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    min1 = max1 = row1;&lt;br /&gt;    min2 = max2 = row2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col1] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min1--;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col2] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min2--;&lt;br /&gt;    top = __max(min1, min2);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;11&lt;/span&gt; &amp;amp;&amp;amp; map[max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col1] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max1++;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;11&lt;/span&gt; &amp;amp;&amp;amp; map[max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col2] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max2++;&lt;br /&gt;    bottom = __min(max1, max2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;检查两条垂直线之间是否有可连通的水平线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = top; j &amp;lt;= bottom; j++)&lt;br /&gt;    {&lt;br /&gt;        path = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = __min(col1, col2) + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; __max(col1, col2); i++)&lt;br /&gt;        {&lt;br /&gt;            path += map[j][i];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是后台线程的代码，调用了上面的方法，过程类似绘制&amp;ldquo;金刚石&amp;rdquo;图形（所有顶点彼此连线），和冒泡排序一类的时间复杂度相同。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('3e07fa46-175d-45ac-b94d-ef2e0c144026')"&gt;&#xD;
&lt;div id="cnblogs_code_open_3e07fa46-175d-45ac-b94d-ef2e0c144026" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;用于寻找可点击方块的后台线程，进入线程时，map 已经初始化好了&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;DWORD WINAPI MyThread(LPVOID lpParameter)&lt;br /&gt;{&lt;br /&gt;    PMYTHREAD_PARAMS pMyParams = (PMYTHREAD_PARAMS)lpParameter;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    HWND hwnd = pMyParams-&amp;gt;hWndUI;&lt;br /&gt;    PCELLPOS pNode1, pNode2;&lt;br /&gt;    BOOL bAllListIsNull;&lt;br /&gt;    BOOL bFind_One_Solution; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否找到了一个解&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( !bThreadStopSignal )&lt;br /&gt;    {&lt;br /&gt;        bAllListIsNull = TRUE;&lt;br /&gt;        bFind_One_Solution = FALSE;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;此处暴力的盲目搜索就是了~。~ 有时间的话需要让此处更&amp;ldquo;智能化&amp;rdquo;！&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pCellPos[0]就是代表空白位置的链表，永远为 NULL （浪费掉了）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; CELL_TYPE_COUNT; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在链表中搜索是否可点击类似金刚石画法，时间复杂度：O(n^2)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCellPos[i] != NULL)&lt;br /&gt;            {&lt;br /&gt;                bAllListIsNull = FALSE; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;存在链表不为空&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   pNode1 = pCellPos[i];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode1 != NULL)&lt;br /&gt;                {&lt;br /&gt;                    pNode2 = pNode1-&amp;gt;pNext;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode2 != NULL)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(CanConnect(map, pNode1-&amp;gt;row, pNode1-&amp;gt;col, pNode2-&amp;gt;row, pNode2-&amp;gt;col))&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到了一对可点击方块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                                 map[pNode1-&amp;gt;row][pNode1-&amp;gt;col] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                            map[pNode2-&amp;gt;row][pNode2-&amp;gt;col] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                            &lt;br /&gt;                            CLICKINFO cInfo;&lt;br /&gt;                            cInfo.row1 = pNode1-&amp;gt;row;&lt;br /&gt;                            cInfo.col1 = pNode1-&amp;gt;col;&lt;br /&gt;                            cInfo.row2 = pNode2-&amp;gt;row;&lt;br /&gt;                            cInfo.col2 = pNode2-&amp;gt;col;&lt;br /&gt;                            SendMessage(hwnd, WM_CLICKINFO_FIND, (WPARAM)pMyParams-&amp;gt;bIsAutoClick, (LPARAM)(&amp;amp;cInfo));&lt;br /&gt;                            &lt;br /&gt;                            RemoveNodeFromList(&amp;amp;pCellPos[i], pNode1);&lt;br /&gt;                            RemoveNodeFromList(&amp;amp;pCellPos[i], pNode2);&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            bFind_One_Solution = TRUE;                        &lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;由于两个Node都已经被释放了，所以必须立即结束对当前链表中的搜索。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bFind_One_Solution)&lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                        pNode2 = pNode2-&amp;gt;pNext;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bFind_One_Solution)&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                    pNode1 = pNode1-&amp;gt;pNext;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;已经没有方块了？&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bAllListIsNull)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;发送消息，所有解已经搜索完毕，游戏可以胜利清空所有方块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              PostMessage(hwnd, WM_SOLUTION_COMPLETE, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;对所有链表都搜索完毕了，但找不到解，需要重排！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!bFind_One_Solution)&lt;br /&gt;        {&lt;br /&gt;            PostMessage(hwnd, WM_NEED_RERANGE, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    bThreadRunning = FALSE;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后这里的双向链表，还有队列等辅助数据结构当然都可以选用STL中的模板，而我没有用STL，此处全部是自写的。这样的好处可能就是非常直观吧，所有代码都在自己的眼皮底下，比较放心罢了。这里给出几个双向链表操作函数，实际上非常简单非常简短。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8b941893-4ef3-45da-ac55-fe1533653857')"&gt;&#xD;
&lt;div id="cnblogs_code_open_8b941893-4ef3-45da-ac55-fe1533653857" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;释放某一个链表，最后把表头置为NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeList(PCELLPOS* ppHead)&lt;br /&gt;{&lt;br /&gt;    PCELLPOS pTmp = NULL;&lt;br /&gt;    PCELLPOS pNode = *ppHead;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode != NULL)&lt;br /&gt;    {&lt;br /&gt;        pTmp = pNode-&amp;gt;pNext;&lt;br /&gt;        free(pNode);&lt;br /&gt;        pNode = pTmp;&lt;br /&gt;    }&lt;br /&gt;    (*ppHead) = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把一个新节点挂接到指定链表上，如果链表为空，则会被创建！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddNodeToList(PCELLPOS* ppHead, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col)&lt;br /&gt;{&lt;br /&gt;    PCELLPOS pNewNode = (PCELLPOS)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(CELLPOS));&lt;br /&gt;    pNewNode-&amp;gt;row = row;&lt;br /&gt;    pNewNode-&amp;gt;col = col;&lt;br /&gt;    pNewNode-&amp;gt;pForward = NULL;&lt;br /&gt;    pNewNode-&amp;gt;pNext = NULL;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*ppHead == NULL)&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNewNode;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到tail节点，然后挂接上去！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         PCELLPOS pCur = *ppHead;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur-&amp;gt;pNext != NULL)&lt;br /&gt;            pCur = pCur-&amp;gt;pNext;&lt;br /&gt;&lt;br /&gt;        pNewNode-&amp;gt;pForward = pCur;&lt;br /&gt;        pCur-&amp;gt;pNext = pNewNode;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;从链表中把指定的节点除去，如果是最后一个节点，则会导致该链表被置为 NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; RemoveNodeFromList(PCELLPOS* ppHead, PCELLPOS pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是表头吗&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode == *ppHead)&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNode-&amp;gt;pNext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; [Forward] &amp;lt;--&amp;gt; [X] &amp;lt;--&amp;gt; [Next]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; [Forward] &amp;lt;-----------&amp;gt; [Next]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;pForward != NULL)&lt;br /&gt;        pNode-&amp;gt;pForward-&amp;gt;pNext = pNode-&amp;gt;pNext;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;pNext != NULL)&lt;br /&gt;        pNode-&amp;gt;pNext-&amp;gt;pForward = pNode-&amp;gt;pForward;&lt;br /&gt;&lt;br /&gt;    free(pNode);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其中，提示可点击方块时，没有直接用窗口 DC 或者屏幕 DC，我用的是 SetWindowRgn 方法（如果用 LayeredWindow 的 COLOR_KEY 会有闪烁，所以改为用 Window RGN）。&lt;/p&gt;&#xD;
&lt;p&gt;最后，暂时发布工具的可执行文件，该工具是采用VS2005 + WIN32 Platform SDK开发，完全绿色的。但它在关闭的时候会在自身所在文件夹下面防止一个 INI 配置文件，实际上我在程序里已经写好了所有默认值，但把 INI 文件放在程序所在位置，也是为了让用户知道那些地方可以配置。但有一项我写死在代码里面了，就是方块样本集合位图的行容量固定为 8，这样的目的是我可以对除法和取余（MOD）用位操作来实现。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载链接：&lt;/strong&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/LLKHelper.rar"&gt;http://files.cnblogs.com/hoodlum1980/LLKHelper.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相同性质文章：《&lt;a id="ctl01_TitleUrl" href="http://www.cnblogs.com/hoodlum1980/archive/2009/05/25/1488571.html"&gt;快速&amp;ldquo;美女找茬&amp;rdquo;（辅助工具）&lt;/a&gt;》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;【补充说明】 by hoodlum1980 @ 2011-11-20&lt;/p&gt;&#xD;
&lt;p&gt;我发现有些人在肆无忌惮的使用&amp;ldquo;秒杀&amp;rdquo;级别的疑似外挂。所以也促使我进行改进。主要是加了系统全局性热键，程序自身的快捷键（因为按键的反应速度要比鼠标点击快），在比拼秒杀速度的时候取消开启线程，而是合并到 UI 线程一次性完成。改进搜索解的循环方式，从每次复位改为轮转式。最终我发现实际上成了反应速度的比拼。假使秒杀耗时是 0.1 秒（具体到底多少可能也无法精确测量），那么如果谁反应速度稍微快 0.1 秒，先行启动，就会赢。所以同为秒杀速度，由于秒杀耗时极短，远小于人能观察出的时间间隔，所以在算法上可能已经很难拼出优势来了。比如从其他方向下手进行改进。当然我也考虑了自动对别人应用各种障碍型道具，但是如果起跑反应慢一点的话，实际上一切都没用，因为你根本不会有应用道具的时间，游戏已经被对方结束了。反正已经够快了，估计暂时就这样了~。~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2254524.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html</id><title type="text">ZOL3505 ( Yet Another Set of Numbers ) 解题报告</title><summary type="text">题意：有一个数字集合，集合中的数遵循以下规则：（1）每个数字的第一位（最高位）不是0; （2）每个数字包含最多 N 位，且只有 0，1，2，3 这四个数字可能出现。（0 &lt; N &lt; 20）; （3）每个数字的相邻位不同（例如：301是有效的，300不是）; （4）数字比较大小和他们的字符串比较方法相同（例如：1 &lt; 123 &lt; 20 &lt; 21 &lt; 3）. 问题是：求满足以下条件的数字A：在集合中恰好有 K-1 个数字比A大，比B小;</summary><published>2011-11-09T19:16:00Z</published><updated>2011-11-09T19:16:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: 18pt;"&gt;ZOL 3505：&lt;span &gt;Yet Another Set of Numbers&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　地址：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3505"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3505&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　题意：有一个数字集合，集合中的数遵循以下规则：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="color: #800080;"&gt;( 1 ). 每个数字的最高位不是 0 ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　( 2 ). 每个数字包含最多 N 位，且只有 0，1，2，3 这四个数字可能出现（0 &amp;lt; N &amp;lt; 20）;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　( 3 ). 每个数字的相邻位不同（例如：301是有效的，300不是）;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　( 4 ). 数字比较大小和他们的字符串比较方法相同（例如：1 &amp;lt; 123 &amp;lt; 20 &amp;lt; 21 &amp;lt; 3）.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　问题是，给出这个集合中的一个数字 B，从数字 B 开始，在这个集合中向前数数到第 K 个数字时输出这个数字（K &amp;gt; 0）;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　原文叙述：求满足以下条件的数字A：在集合中恰好有 ( K - 1 ) 个数字大于 A 小于 B （题目保证存在解）;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　时空限制：Time Limit: &lt;/span&gt;2 Seconds;&amp;nbsp; Memory Limit: 65,536 KB;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　例如：当 N = 2 时，这个集合中一共有 12 个数字，依次是：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　1 &amp;lt; 10 &amp;lt; 12 &amp;lt;&amp;nbsp; &lt;strong&gt;[ &lt;span style="color: #ff0000;"&gt;13 &lt;/span&gt;]&lt;/strong&gt; &amp;lt; 2 &amp;lt; 20 &amp;lt; 21 &amp;lt; 23 &amp;lt; &lt;strong&gt;[ &lt;span style="color: #0000ff;"&gt;3 &lt;/span&gt;]&lt;/strong&gt; &amp;lt; 30 &amp;lt; 31 &amp;lt; 32;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;----（序列中A和B用方括号标示）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　当 B = 3 时，K = 5 时，从集合中的 3 向前数到第&amp;nbsp;5 个数字时是 13，因此应该输出 13。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（1）第一个解法，模拟法（Result：TLE）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　我想到的第一个解法是，观察这个序列的规律，然后用模拟数数的方法，依次向前数，数到第 K 个为止即可。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　考虑集合中最大的一个数字的字符串表示，显然是以下形式 "3232..."（长度为 N）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　因此可以给出下面的模拟数数的第一个解，模拟法代码如下：&amp;nbsp;&lt;span style="background-color: #ffcc99; color: #ff0000;"&gt; ( X. 以下代码算法时间超出题目限制 ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c14a2deb-e638-497a-9cad-8e59365af54a')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c14a2deb-e638-497a-9cad-8e59365af54a" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; length; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前数字的字符串长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Num[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;检测当前数字是否合法&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; IsNumValid()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 第一位不能为0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相邻位不能相同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; (length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;); i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[i] == Num[i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetNextNum(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; _MaxChars[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;32&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 如果最后一个字符是0，则去掉结尾的0 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            length--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//ELSE: &lt;/span&gt;&lt;span style="color: #008000;"&gt;当前字符递减后，立即扩展到 N 的长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = length; i &amp;lt; N; i++)&lt;br /&gt;        {&lt;br /&gt;            Num[i] = _MaxChars[ (i - length) &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ];    &lt;br /&gt;        }&lt;br /&gt;        length = N;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( !IsNumValid() );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符串最大长度, 0 &amp;lt; N &amp;lt; 20 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; K = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;往下数第K个数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;往下数多少个&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;N, &amp;amp;K) != EOF)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Num);        &lt;br /&gt;        length = strlen(Num);        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; index &amp;lt; K; index++)&lt;br /&gt;        {&lt;br /&gt;            GetNextNum(N);&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Num);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;br /&gt;　　　　但第一个方法提交后超时。显然，如果 N 比较大，这个集合中的数字数量是非常大的，因此这时 K 也可以取得很大。而这个方法是一个笨方法，是一个一个数字向前找，且还要进行数字合法校验，时间效率很低。当 N 和 K 都比较大时，这个方法在速度上显然不能满足要求。因此不能使用笨方法，必须找出这个序列中蕴藏的内在规律。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（2）速度更快的解法：使用三叉树模型（Result：MLE）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　观察这个序列的规律，考虑数字用字符串进行比较的特点，比较时，越高（靠左）的位越重要，越低的位则不重要。&lt;/span&gt;&lt;span &gt;因此考虑把每一位看作一个节点，则低位属于高位的子节点，父子节点彼此属于相邻的位，显然有每个节点含有三个子节点（由于每一位上只能在 0，1，2，3 中选择，且不能与父节点数字相同），因此形成一个满的三叉树。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　每个节点代表了序列中的一个数字，把从根节点到该节点的路径所经过的节点依次输出，就是这个数字的字符串表示。当 N = 2 时，该树如下图所示：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111001535314.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;题意中的规则（2）规定了树的高度，规则（1）和（3）使该树从完全四叉树变成完全三叉树，规则（1）去掉了&amp;ldquo;0&amp;rdquo; 子树，规则（3）缩减了子节点个数。&lt;/p&gt;&#xD;
&lt;p&gt;考虑两个树节点 N1&amp;nbsp;和 N2 之间的排序关系（比较时，深度小的节点比深度大的节点重要），注意和字符串比较算法进行对比：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;（a）如果 N1 节点位于 N2 的路径上，则路径短的节点小；( eg. 123 &amp;lt; 1230 )&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;　　　　（b）如果 N1 和 N2 在节点 N' 处开始分离（从根节点到 N&amp;rsquo; 处路径重合），则进入 N' 左侧子树的小于进入 N' 右侧子树的。( eg. 121230&amp;nbsp;&amp;lt; 123&amp;nbsp;)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;　　　　（c）从前两点可知，此树前序遍历（先遍历当前节点的所有子节点，然后访问当前节点），即为数集合的有序排列。（对比：二叉查找树的中序遍历为有序序列）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图中节点圆圈中的黑色数字就是用于组成输出数字的位（num）。为了统计树中每个子树所代表的子序列中的数字个数，我们在每个节点上加一个属性 sum，表示以该节点为根的子树所表征的数字组成的子序列的数字个数，在图中用节点旁边的红色数字表示。显然，节点的 sum，就是以该节点为根的子树所包含的所有节点的数目，因为每个节点都一对一的代表集合中一个数字，用节点路径表示（&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;类似贪心算法中的霍夫曼编码和霍夫曼树的关系&lt;/span&gt;）。由于输出节点路径时，根节点无需输出 ( dummy node )，因此根节点用阴影填充，和子节点的连线用虚线表示。&lt;/p&gt;&#xD;
&lt;p&gt;显然，最底层的所有叶子节点（深度为 N + 1）仅代表一个数字，其 sum = 1，对非叶子节点，其三个子节点的 sum 值相同，再加上自身节点代表的数字，因此有：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Node.sum = Node.Child[&lt;span style="color: #ff0000;"&gt;0&lt;/span&gt;].sum * &lt;span style="color: #ff0000;"&gt;3&lt;/span&gt; + &lt;span style="color: #ff0000;"&gt;1&lt;/span&gt; ;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　因此对于本题目来说，可以创建这样一个三叉树，对于给定的数字 B，设它对应的是树中的节点 B，从 B 节点开始，向前回退寻找目标节点 A。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　为了清楚的描述算法，我用节点游标的形式来阐述该算法（在代码中可以是一个节点的指针，表示当前所处的位置），并做如下定义：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;(a). K 的逻辑含义是，代表当前节点和目标节点 A 的&amp;ldquo;&lt;strong&gt;距离&lt;/strong&gt;&amp;rdquo;。寻找过程中 K 的值将不断减小，直到为 K = 0 ，表示到达目标节点A。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　(b). 游标指向的改变称为 &amp;ldquo;&lt;strong&gt;移动到&amp;rdquo; &lt;/strong&gt;某个节点。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　(c). 如果节点需要处理（即调整 K 值），称为&amp;ldquo;&lt;strong&gt;访问&lt;/strong&gt;&amp;rdquo; ( visit ) 该节点。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　(d). 如果节点不需要处理（即不需要调整 K 值），称为&amp;ldquo;&lt;strong&gt;经过&lt;/strong&gt;&amp;rdquo; ( pass ) &amp;nbsp;该节点。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　则算法（2）的基本步骤（&lt;span style="color: #800080;"&gt;GetNodeBySteps&lt;/span&gt; ）如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="color: #0000ff;"&gt;(2.1). 令游标指向起始节点 B; &lt;span style="color: #008000;"&gt;（这是准备工作，接下来将&amp;ldquo;向前&amp;rdquo;寻找节点 A）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span &gt;　　　　(2.2). 如果所在节点已经是兄弟节点中的老大（位于最左侧），则（向上）&amp;ldquo;&lt;strong&gt;访问&lt;/strong&gt;&amp;rdquo;其父节点，令 &lt;span style="color: #ff0000;"&gt;K = K - 1&lt;/span&gt;;&amp;nbsp; 跳到（2.6）; &lt;span style="color: #008000;"&gt;（请思考为什么此处 K 的递减值是 1 而不是 Node.sum？）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span &gt;　　　　(2.3). 如果所在节点有哥哥节点，则（向左）移动到它的哥哥节点; &lt;span style="color: #008000;"&gt;（接下来在 （2.4）和（2.5）中一定能找到一个可访问节点，请思考这是为什么？）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="color: #0000ff;"&gt;(2.4).&amp;nbsp;如果 Node.sum&amp;nbsp;&amp;lt;= K ，则&lt;strong&gt;&amp;ldquo;访问&amp;rdquo;&lt;/strong&gt;该节点，令 &lt;span style="color: #ff0000;"&gt;K = K - Node.sum&lt;/span&gt;，跳到（2.6）;&lt;span style="color: #008000;"&gt; （备注：Node.sum &amp;lt; K 时说明 A 不位于该节点为根的子树中）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;　　　　(2.5). 如果 Node.sum &amp;gt; K，&lt;span style="color: #008000;"&gt;（备注：说明 A 位于 Node 为根的子树中） &lt;/span&gt;则连续的（向下）移动到当前节点的（最右侧）最幼子节点，直到找到符合（2.4）中的条件（Node.Sum &amp;lt;= k）的节点为止，然后用和（2.3）的相同方法&lt;strong&gt;&amp;ldquo;访问&amp;rdquo;&lt;/strong&gt;它：令 &lt;span style="color: #ff0000;"&gt;K = K - Node.sum&lt;/span&gt;; &lt;span style="color: #008000;"&gt;（这是一个嵌在内部的 while 循环）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;　　　　(2.6). 如果 K != 0，则重复（2.2）~ （2.5）。直到 K = 0 为止，此时我们到达的节点就是目标节点 A，输出节点 A 的路径就是问题的解;&lt;span style="color: #008000;"&gt;（这是最外层的 while 循环）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结上面的探查方法：如果一个节点是被访问节点，则绝不会再进入它的任何子树；当寻找下一个可访问节点时，如果左侧有哥哥节点，则一定先探查哥哥节点（如果哥哥节点没有超越目标，则访问它；否则进入它的幼子子树继续探查），否则访问父节点（此时父节点必是可访问节点）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的语言接近伪码，括号内的描述属于导航时的逻辑方向或备注性说明。显然（2.2）~（2.6）整体是一个 while 循环，其中（2.5）是嵌在其内的又一个 while 循环。上诉步骤即对应的是代码中的 &lt;span style="color: #800080;"&gt;GetNodeBySteps&lt;/span&gt; 方法，参数 step 即 K。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;【&lt;strong&gt;思考】：为何（2.2）向父节点回退时的访问和（2.4）和（2.5）中的访问方法不同，&lt;/strong&gt;前者令 K 递减 &lt;span style="color: #800080;"&gt;1&lt;/span&gt;，后者令 K 递减 &lt;span style="color: #800080;"&gt;Node.sum&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #008000;"&gt;&lt;em&gt;　　　　&lt;/em&gt;（提示：前者，当子节点向父节点&amp;ldquo;回退&amp;rdquo;时，子节点为根的子树位于其父节点所代表的子树中。后者则进入到了另一个独立的子树。）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　第二个解法的代码（三叉树方法），如下所示：&amp;nbsp;&lt;span style="background-color: #ffcc99; color: #ff0000;"&gt; ( X. 以下代码内存使用超出题目限制 ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('4d165e46-9eaf-4b75-a084-7c2c1e8e92bf')"&gt;&#xD;
&lt;div id="cnblogs_code_open_4d165e46-9eaf-4b75-a084-7c2c1e8e92bf" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _NODE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; index;  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在兄弟节点中的排行索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; num;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点数字, 只能取下列值 0,1,2,3，为 'R' 时表示 root &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; sum;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 + 3 + 9 + ... + 3^k &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    _NODE* parent;   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 父节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    _NODE* child[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 子节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;} NODE, *PNODE;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/* &lt;/span&gt;&lt;span style="color: #008000;"&gt;递归函数： N - 树的深度（不含根节点的深度） &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddChildren(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, _num = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;;&lt;br /&gt;    PNODE pChild = NULL;&lt;br /&gt;    pNode-&amp;gt;sum = pNode-&amp;gt;sum * &lt;span style="color: #800080;"&gt;3&lt;/span&gt; + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;child[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == NULL)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            pChild = (PNODE)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;            memset(pChild, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;            pChild-&amp;gt;parent = pNode;&lt;br /&gt;            pChild-&amp;gt;index = i;&lt;br /&gt;            pChild-&amp;gt;sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 回避父节点数字 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;num == _num) _num++;&lt;br /&gt;            pChild-&amp;gt;num = _num++;&lt;br /&gt;&lt;br /&gt;            pNode-&amp;gt;child[i] = pChild;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;            AddChildren(pNode-&amp;gt;child[i]);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;PNODE CreateTree(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    PNODE pRoot = (PNODE)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;    memset(pRoot, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;    pRoot-&amp;gt;num = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;根节点数字为0，可以让第一层子节点为1，2，3 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    pRoot-&amp;gt;sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; depth; i++)&lt;br /&gt;    {&lt;br /&gt;        AddChildren(pRoot);&lt;br /&gt;    }&lt;br /&gt;    pRoot-&amp;gt;num = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;R&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pRoot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 释放树占用的内存（递归函数） &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeTree(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;child[i] != NULL)&lt;br /&gt;        {&lt;br /&gt;            FreeTree(pNode-&amp;gt;child[i]);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    free(pNode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从节点 pStart 向前追溯到某个节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;PNODE GetNodeBySteps(PNODE pRoot, PNODE pStart, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; step)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; remainStep = step;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index;&lt;br /&gt;    PNODE pCurNode = pStart, pNextNode = NULL;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(remainStep &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到下一个不大于 remainStep 距离的节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        index = pCurNode-&amp;gt;index;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 向上返回一层时，只-1 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            pCurNode = pCurNode-&amp;gt;parent;&lt;br /&gt;            remainStep--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        pNextNode = pCurNode-&amp;gt;parent-&amp;gt;child[ index - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNextNode-&amp;gt;sum &amp;gt; remainStep)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 向下进入最右侧的最小子节点分支 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            pNextNode = pNextNode-&amp;gt;child[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;];&lt;br /&gt;        }&lt;br /&gt;        pCurNode = pNextNode;&lt;br /&gt;        remainStep -= pCurNode-&amp;gt;sum;                &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pCurNode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; path: 字符串形式例如&amp;ldquo;12301&amp;rdquo; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;PNODE GetNodeByPath(PNODE pRoot, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* path)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = path;&lt;br /&gt;    PNODE pCur = pRoot;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCur-&amp;gt;child[i]-&amp;gt;num == (*p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                pCur = pCur-&amp;gt;child[i];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pCur;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 借助辅助栈，输出找到的节点的路径（从根节点到该节点）&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputNodePath(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; stack[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; top = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    PNODE pCur = pNode;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur-&amp;gt;parent != NULL)&lt;br /&gt;    {&lt;br /&gt;        stack[top++] = pCur-&amp;gt;num;&lt;br /&gt;        pCur = pCur-&amp;gt;parent;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(top &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, stack[ top - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ]);&lt;br /&gt;        --top;&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth, step;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; path[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    PNODE pRoot, pStart, pDest;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;depth, &amp;amp;step) != EOF)&lt;br /&gt;    {&lt;br /&gt;        gets(path);&lt;br /&gt;        pRoot = CreateTree(depth);&lt;br /&gt;        pStart = GetNodeByPath(pRoot, path);&lt;br /&gt;        pDest = GetNodeBySteps(pRoot, pStart, step);&lt;br /&gt;        OutputNodePath(pDest);&lt;br /&gt;        FreeTree(pRoot);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　【分析】为什么算法（2）比算法（1）快？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　算法（1）永远是一个一个数字向前数，步进值（step）永远为 1 ; 当初我想改进算法（1）时发现，如果不借助数据结构，很难在原基础上进行改进。集合中的数也很难用数学公式计算或总结（这也是采用模拟法的原因）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　算法（2）是在树中导航，注意树节点越往上（深度越小），节点的 sum 值越大（而且是随着深度减小，以极快的指数速度增长），所以算法（2）的数数方式是跳跃式的，而且能用很快速度探索到一个理想的 Step 值（该 Step 足够大，又满足 Step &amp;lt;= K ，即向目标迈进的步子足够大，而又不会超越目标节点），该 Step 由树节点的 sum 值表示，然后直接越过该子树所代表的子集合，无需遍历该子集合（所有数字或树节点）。因此访问的节点在树中的深度越浅（越靠近树根），则以该节点为根的子树的规模就越大，代表着跨越的数字个数就越多。由于每个节点最多只有两个哥哥节点，在同一深度向前移动时所消耗的时间不多，因此算法能以很快的速度上升到跨度尽可能大的可访问节点。因此算法（2）在时间上比算法（1）高效的多。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　算法（2）的另一种形象理解是：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　B &amp;gt; A，则水平方向 B 位于 A 子树的下方或 A 的右侧子树。则存在一个深度最大（设深度为 d ）的公共子树 T ，满足 A, B &amp;isin; T 。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　现在从节点 B 出发，寻找节点 A。由于 A 比 B 小，因此 B 不可能是 T 的根。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="color: #800080;"&gt;(a). 如果 A&amp;nbsp;不是 T 的根，则必然 A 和 B 分别位于 T 的左右两个子树。因此从 B 所在的右侧子树上浮到 （d+1） 深度后，继续向前移动到 A 所在的左侧子树，然后靠右侧下沉到&amp;nbsp;A 。（搜寻路线类似梯形）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　(b). 如果 A&amp;nbsp;是 T 的根，则靠左上浮到 A 。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　上诉两种情况，在水平方向上在各个深度上都可能呈现一些向左的水平步进。因此在 &lt;strong&gt;&lt;span style="color: #0000ff;"&gt;向前向上 &lt;/span&gt;探寻时，探寻路径呈&amp;ldquo;锯齿形&amp;rdquo;。&lt;span style="color: #0000ff;"&gt;向下&lt;/span&gt;探寻时则是&amp;ldquo;直线&amp;rdquo;式下降。&lt;/strong&gt;对平均情况，探索路径的长度（时间）和树的高度 N 为线性关系。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111011573432.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Figure 1. 节点 B 到节点 A 的探寻路径；&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　　　&lt;/strong&gt;如 Figure 1 所示。图中红色虚线箭头相连得到的路径，即为从 B 到 A 的探寻路径。图中 A 和 B 的最深公共子树 T 是数字&amp;ldquo;10&amp;rdquo;所在节点，同时 T 被用粗线表示。灰色节点为可访问节点，斜线表示的节点为位于搜索路线上，但是被经过（Pass）的节点。图中 N = K = 4；从 A 到 B 的序列是：{ &lt;span style="color: #ff0000;"&gt;1021&lt;/span&gt;, 1023, 103, 1030, &lt;span style="color: #0000ff;"&gt;1031&lt;/span&gt; } ;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　【缺陷】但算法（2）的结果是内存超出限制（MLE）。理由实际上同（1），当 N 很大时，树非常庞大。由于它是一个满三叉树，所以节点数量是一个等比数列的和：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;strong&gt;Sum&lt;/strong&gt;&amp;nbsp; = &amp;nbsp;&lt;strong&gt;&amp;sum;&lt;/strong&gt; &lt;span style="color: #800080;"&gt;( 3 ^&amp;nbsp;i )&lt;/span&gt;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1 + 3 + 9 + 27 + ... + 3^N&lt;/span&gt;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;( 3 ^ ( N + 1) - 1 ) / 2 &lt;/span&gt;;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;span style="color: #800080;"&gt;&lt;em&gt;　　　　　　　　&lt;/em&gt;&lt;span style="color: #008000;"&gt;----( 高度为 N + 1&amp;nbsp;的三叉树的所有节点数量 ) ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　从上式粗略估算可知内存需求极大，产生 MLE 也就不足为奇了，&lt;/span&gt;&lt;span &gt;考虑极限情况：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;strong&gt;　　　　&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;strong&gt;　　　　假设 N = &lt;span style="color: #0000ff;"&gt;19&lt;/span&gt;，则此树共含有 &lt;span style="color: #ff0000;"&gt;1,743,392,200&lt;/span&gt; 个节点。&lt;/strong&gt;设每个节点占用 24 Bytes 则：&lt;strong&gt;在内存中建立该树需要：&lt;span style="color: #ff0000;"&gt;38.97 GB ！！！ &lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="color: #000000;"&gt;@_@ ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　（1）和（2）的解法一个超时一个超内存限制，都是因为该集合的元素数量非常大导致的。既要利用（2）中的三叉树模型的时间效率，但又不能采用在内存中完整建立树的方法，因此导出下面的第三个解法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（3）正确解：虚拟树 / 树枝法（Result：AC）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　为了时间效率，依然采用三叉树的模型，但是不能在内存中完整建树，因此启发我们，可以在内存中仅仅保留一条树枝，该树枝最长的长度（叶子在树中所处的深度）为 N。考察解法（2）中的方法，无非是在树之间进行导航，即从某个节点到其父节点，左侧的哥哥节点，右下方的幼子节点。同时，由于此树满足，相同深度的所有节点的 sum 值相同。因此我们可以仅用一条树枝即完成（2）中的算法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　方法是：&lt;span style="color: #800080;"&gt;在内存中不建立整个树，而是仅仅存储一个当前树枝。&lt;/span&gt;树枝长度可伸缩，最大为N。树枝采用一个线性表结构保存，可以使用数组或链表（为了代码简便我们使用数组）。每个节点依然含有两个属性： num 和 sum。如果说算法（2）中的树是内存中的实际树（物理树），则算法（3）中的树是仅存在于思维模型中的&amp;ldquo;虚拟树&amp;rdquo;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　一个树枝在树中的位置，以及它在数组中的存储状态如下图所示，图中树枝部分用实体粗线条表示，整个树由于不在内存中，因此用虚线表示：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111003590461.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　为了实现算法，我们必须很容易的确定该树枝在完整的树模型中的位置和形态。即容易实现以下问题：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;　　　　&lt;span style="color: #800080;"&gt;（3.1）求出某个节点在同辈兄弟中的排行索引（ Index_In_Siblings ） ，&amp;isin; { 0，1，2 } ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #800080;"&gt;&lt;span &gt;　　　　（3.2）求出某个节点的哥哥节点（左侧）的 num （ Num_Of_Elder_Brother ），&amp;isin; { 0，1，2，3 } ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #800080;"&gt;　　　　（3.3）求出某个节点的幼子节点（右下）的 num （ Num_Of_Right_Child ），&amp;isin; { 0，1，2，3 } ;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;　　　　&lt;span style="color: #000000;"&gt;其中（3.1）和（3.2）可以通过本节点的 num 和其父节点的 num 推断得出。（3.3）可以从本节点的 num 求出。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　算法执行过程中，随着游标在树中的节点之间移动，树枝在树中的伸展形态（在树中的位置和树枝的长度）也同时发生变化，当寻找到目标节点 A 以后，树枝静止在最终状态，根据方法返回的树枝长度即可确定最终的树枝。目标节点 A 即为最终树枝的末端叶子节点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　因此解法（3）三叉树树枝法算法与（2）相同，但解决了空间复杂度的问题，代码如下：&amp;nbsp;&lt;span style="color: #ccffcc;"&gt;&lt;span style="background-color: #ccffcc; color: #339966;"&gt; ( &lt;span style="background-color: #ccffcc; color: #339966;"&gt;&amp;radic;. &lt;/span&gt;以下代码是可接受的&amp;nbsp;) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('cc0d495f-49e1-4579-9f88-fe801dfc2d2d')"&gt;&#xD;
&lt;div id="cnblogs_code_open_cc0d495f-49e1-4579-9f88-fe801dfc2d2d" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _NODE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; num;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点数字, 取值 0,1,2,3 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; sum;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 + 3 + 9 + ... + 3^k &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;} NODE, *PNODE;&lt;br /&gt;&lt;br /&gt;NODE nodes[&lt;span style="color: #800080;"&gt;20&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;树枝&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化树枝各个节点的 sum 值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; InitSums(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;叶子节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     nodes[N-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = N - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; i &amp;gt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt; ; --i)&lt;br /&gt;    {&lt;br /&gt;        nodes[i].sum = nodes[i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].sum * &lt;span style="color: #800080;"&gt;3&lt;/span&gt; + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化树枝各个节点的 num 值&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;path: "1231"&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; InitNodesByPath(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *path)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = path;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        nodes[depth].num = (*p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;        ++depth;&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; depth - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;输出指定深度节点的路径（从根节点到该节点）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputNodePath(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt;= depth; i++)&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, nodes[i].num);&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取节点在兄弟节点中的排行索引&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetIndexInSibling(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(depth == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nodes[depth-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num &amp;gt; nodes[depth].num)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; nodes[depth].num;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回哥哥节点的数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetBrother(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(depth &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; nodes[depth-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num == result)&lt;br /&gt;    {&lt;br /&gt;        --result;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回幼子的数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetRightChild(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nodes[depth].num == &lt;span style="color: #800080;"&gt;3&lt;/span&gt;)&lt;br /&gt;        result = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;从节点A开始向前追溯到节点B，返回对应深度&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;nStart: 节点A的深度&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;step：节点A和B之间的距离&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetNodeBySteps(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStart, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStep)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; remainStep = nStep;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth = nStart;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(remainStep &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;回退到父节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(GetIndexInSibling(depth) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向上返回一层时，只-1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            depth--;&lt;br /&gt;            remainStep--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;进入哥哥节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         nodes[depth].num = GetBrother(depth);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(nodes[depth].sum &amp;gt; remainStep)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向下进入最右侧的最小子节点分支&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              nodes[depth + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num = GetRightChild(depth);&lt;br /&gt;            depth++;&lt;br /&gt;        }&lt;br /&gt;        remainStep -= nodes[depth].sum;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; depth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N, K;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; path[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStart, nDest;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;N, &amp;amp;K) != EOF)&lt;br /&gt;    {&lt;br /&gt;        gets(path);&lt;br /&gt;        InitSums(N);&lt;br /&gt;        nStart = InitNodesByPath(path);&lt;br /&gt;        nDest = GetNodeBySteps(nStart, K);&lt;br /&gt;        OutputNodePath(nDest);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　以上代码提交后的结果是 AC。运行消耗是时间 120 ms，空间 180 KB。空间需求微不足道可以说是O（1），但用时是解排行榜单上的其他 C++ 优秀解法用时（40ms ~ 60ms）的两三倍。一可能是我用了很多很小的函数，没有inline，多少带来一些函数调用的开销，二是可能别人的算法要比我更快更好。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　&lt;strong&gt;【分析】为什么可以使用树枝的方法？&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　此题目中，树的规模非常大，所以逼迫我们使用了树枝法，那么为什么可以不在内存中建立树呢，这是因为树自身具有的内在规律，即节点不是完全随机和独立的，而是存在下面的关系，假设树根深度为 1，树的高度（叶子节点的深度）为（N + 1），则&lt;/span&gt;&lt;/span&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;深度为 d 的节点：Node.sum = ( 3 ^ (N +&amp;nbsp;2 - d ) - 1 ) / 2;&amp;nbsp; 对于非叶子节点，有三个子节点，按升序排列并与父节点不重复。因为有了这些已知条件，使我们能推断出我们需要的节点的信息，因此不需要一个完整的树来存储它。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　【说明】本文所有插图，使用 Microsoft Office Visio 绘制。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2243839.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html</id><title type="text">ZOL 简单题集合（二）</title><summary type="text">ZOL 简单题集合之二。</summary><published>2011-11-08T19:59:00Z</published><updated>2011-11-08T19:59:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html"/><content type="html">&lt;p&gt;对以下简单题，我同时给出一个我主观认为的难度值（0.1~1.0之间）。&lt;/p&gt;&#xD;
&lt;p&gt;(1). ZOL1072: Microprocessor Simulation. (Difficulty: 0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1072"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1072&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;微处理器模拟，它含有两个累加器，代码和内存统一寻址，即冯诺依曼结构，比较简单。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('94d41302-021e-4227-ae1b-2fae132d003c')"&gt;&#xD;
&lt;div id="cnblogs_code_open_94d41302-021e-4227-ae1b-2fae132d003c" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; mem[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 256 words 内存 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; A;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A 累加器 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; B;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; B 累加器 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PC;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;程序计数器，code取址用&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Run()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; flag_STOP = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; code, addr;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; tmp;&lt;br /&gt;    PC = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; reset PC &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(PC &amp;gt;= &lt;span style="color: #800080;"&gt;0xF0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 取指令 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        code = mem[PC];&lt;br /&gt;        ++PC;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;(code)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; LD: Load accumulator A with the contents of memory &lt;br /&gt;               at the specified argument.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;: &lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            A = mem[addr];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; ST: Write the contents of accumulator A to the memory&lt;br /&gt;               location specified by the argument.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            mem[addr] = A;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; SWP: Swap the contents of accumulators A and B. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;:&lt;br /&gt;            tmp = A;&lt;br /&gt;            A = B;&lt;br /&gt;            B = tmp;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; ADD: Add the contents of accumulators A and B. The &lt;br /&gt;               low word of the sum is stored in A, and the high &lt;br /&gt;               word in B. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;:&lt;br /&gt;            tmp = A + B;&lt;br /&gt;            A = (tmp &amp;amp; &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;);&lt;br /&gt;            B = (tmp &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; INC: Increment accumulator A. Overflow is allowed; &lt;br /&gt;               that is, incrementing F yields 0. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;:&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;) A = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; A++;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; DEC: Decrement accumulator A. Underflow is allowed; &lt;br /&gt;               that is, decrementing 0 yields F.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;:&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) A = &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; A--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; BZ: If accumulator A is zero, the next command to be &lt;br /&gt;               executed is at the location specified by the argument. &lt;br /&gt;               If A is not zero, the argument is ignored and nothing &lt;br /&gt;               happens. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                PC = addr;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; BR: The next command to be executed is at the location &lt;br /&gt;               specified by the argument. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;7&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC = addr;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; STP: Stop execution of the program. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;:&lt;br /&gt;            flag_STOP = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(!flag_STOP);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; CharToNum(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; NumToChar(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800080;"&gt;9&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800080;"&gt;10&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;264&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 读取一次完整的输入 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; strlen(line); j++)&lt;br /&gt;            {&lt;br /&gt;                mem[i] = CharToNum(line[j]);&lt;br /&gt;                i++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(i &amp;lt; &lt;span style="color: #800080;"&gt;256&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;结束输入的标志&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(mem[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;8&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        Run();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; output &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;256&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, NumToChar(mem[j]));&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(2). ZOL1414: Num Steps. (Difficulty: 0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1414"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1414&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个网格如下图所示，给出一个坐标（x，y），要求输出其数字，如果没有数字则输出 "No Number&amp;rdquo;;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111406080629.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('a11a0a59-58a4-4b6c-a053-f513a2490351')"&gt;&#xD;
&lt;div id="cnblogs_code_open_a11a0a59-58a4-4b6c-a053-f513a2490351" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x, y, num;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x, &amp;amp;y);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x - y == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; || x - y == &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            num = ((x &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;) + (x &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) - (x - y);&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, num);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No Number\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(3). ZOL1170: String Matching. (0.3)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1170"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1170&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;求出两个字符串的相似值（一个化简后的分数）。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b8f9b91f-215f-475c-b28f-0a97fd5e5bd5')"&gt;&#xD;
&lt;div id="cnblogs_code_open_b8f9b91f-215f-475c-b28f-0a97fd5e5bd5" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; szLine[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到两个字符串的相同字符个数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; SameLetterCount(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s1, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p1 = s1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p2 = s2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p1 &amp;amp;&amp;amp; *p2)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*p1 == *p2) count++;&lt;br /&gt;        ++p1;&lt;br /&gt;        ++p2;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;此方法的时间复杂度应该是O(n ^ 2)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetAppx(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s1, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s2, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* pAppx, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* pTotalLen)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, tmp_appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, index;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len1 = strlen(s1);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len2 = strlen(s2);&lt;br /&gt;&lt;br /&gt;    *pTotalLen = len1 + len2;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(s1, s2) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        *pAppx = *pTotalLen;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(index = -(len2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;); index &amp;lt;= len1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; ++index)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            tmp_appx = SameLetterCount(s1, s2 - index);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            tmp_appx = SameLetterCount(s2, s1 + index);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(tmp_appx &amp;gt; appx)&lt;br /&gt;            appx = tmp_appx;&lt;br /&gt;    }&lt;br /&gt;    *pAppx = appx * &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 辗转相除法，求最大公约数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetGcd(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; tmp;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(b &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        tmp = a % b;&lt;br /&gt;        a = b;&lt;br /&gt;        b = tmp;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBlank = NULL;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; totalLen = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, gcd = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        gets(szLine);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(szLine, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在空格处截断字符串&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         pBlank = strchr(szLine, &lt;span style="color: #800000;"&gt;' &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;        *pBlank = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;        GetAppx(szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &amp;amp;appx, &amp;amp;totalLen);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(appx == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = 0\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(appx == totalLen)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = 1\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;化简分数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              gcd = GetGcd(totalLen, appx);&lt;br /&gt;            totalLen /= gcd;&lt;br /&gt;            appx /= gcd;&lt;br /&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = %d/%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;br /&gt;                szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, appx, totalLen);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(4). ZOL1240: IBM Minus One (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1240"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1240&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;超级简单，把字符串中每个字符用其字母序后面的字符替换。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('67a92deb-1937-4e39-b7a7-79300861dbe6')"&gt;&#xD;
&lt;div id="cnblogs_code_open_67a92deb-1937-4e39-b7a7-79300861dbe6" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把每个字母向后旋转一格，c = c + 1, Z-&amp;gt;A&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Transfer(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* p = s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*p == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) *p = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; *p = *p + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;56&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i;&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        Transfer(line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;String #%d\n%s\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, line);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(5) ZOL1295: Reverse Text (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1295"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1295&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;反转字符串，即 CRT 中的 strrev。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('3ac6ec16-7d62-4581-8d5b-3b1affe382d8')"&gt;&#xD;
&lt;div id="cnblogs_code_open_3ac6ec16-7d62-4581-8d5b-3b1affe382d8" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; reverse(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* str)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; tmp;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right = strlen(str) - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(left &amp;lt; right)&lt;br /&gt;   {&lt;br /&gt;       tmp = str[left];&lt;br /&gt;       str[left] = str[right];&lt;br /&gt;       str[right] = tmp;&lt;br /&gt;       ++left;&lt;br /&gt;       --right;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; str[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;n; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(str);&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;scanf("%s", str);&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        reverse(str);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, str);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(6). ZOL1383: Binary Numbers (0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1383"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1383&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;输出一个数字二进制表示中 1 所在的位。（注意输出格式）&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c2b4d6db-8403-477e-892f-a27b74c599c6')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c2b4d6db-8403-477e-892f-a27b74c599c6" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i, num, iDigit;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否需要在该位前输出一个空格&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bNeedSpace;&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;num);&lt;br /&gt;        iDigit = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        bNeedSpace = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(num != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(num &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bNeedSpace) printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, iDigit);&lt;br /&gt;                bNeedSpace = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            num = (num &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;            ++iDigit;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(7). ZOL1814: Candy Sharing Game (0.2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1814"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1814&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;分糖果游戏，学生围成一圈，每次把手里的一半糖果分给右侧的人，如果任何人糖果为奇数，则再分给他一颗，直到所有人持有糖果数相同。模拟法。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('4f4d518f-1541-4f06-872d-a045ddd6eecb')"&gt;&#xD;
&lt;div id="cnblogs_code_open_4f4d518f-1541-4f06-872d-a045ddd6eecb" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;students: 每个学生持有的糖果数（逆时针方向）&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;n: 学生个数&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;rounds：游戏轮次&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;candy：游戏结束时每个学生手里的糖果数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Play(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* students, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* rounds, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* candy)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, students0, tmp_candy, left_candy;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bGameOver;&lt;br /&gt;    *rounds = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        students0 = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;];&lt;br /&gt;        bGameOver = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;        {&lt;br /&gt;            left_candy = (i == (n-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;))? students0 : students[i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            students[i] = (students[i] + left_candy)/&lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果是奇数，立即再给他一个糖果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(students[i] &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                students[i]++;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                tmp_candy = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bGameOver &amp;amp;&amp;amp; students[i] != tmp_candy)&lt;br /&gt;            {&lt;br /&gt;                bGameOver = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        (*rounds)++;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bGameOver) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;最终结果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    *candy = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; students[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; rounds, candy;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;n; i++)&lt;br /&gt;            scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, (students + i));&lt;br /&gt;&lt;br /&gt;        Play(students, n, &amp;amp;rounds, &amp;amp;candy);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, rounds, candy);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(8). ZOL2680: Clock (0.3)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2680"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2680&lt;/a&gt;&lt;br /&gt;给出 5 个时刻，按时钟的时针，分针夹角从小到大排序，输出中间的时刻。显然，整数分钟（不考虑秒）时刻，时针分针的夹角是 0.5 角度的整数倍，因此为回避浮点数，采用 0.5 度为指针夹角的基本单位（一个圆周为 360 度）。由于需要输出的只是排序后的中间元素，排序时只要排好一半即可。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('25473b66-5f83-4d94-bd45-ba6914f5d35b')"&gt;&#xD;
&lt;div id="cnblogs_code_open_25473b66-5f83-4d94-bd45-ba6914f5d35b" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; tagTime&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; angle; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;夹角以0.5度为单位&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; minute;&lt;br /&gt;} TIME;&lt;br /&gt;&lt;br /&gt;typedef TIME Item;&lt;br /&gt;&lt;br /&gt;Item items[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; lessthan(Item t1, Item t2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;     (t1.angle &amp;lt; t2.angle) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.angle &amp;gt; t2.angle) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.hour &amp;lt; t2.hour) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.hour &amp;gt; t2.hour) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.minute &amp;lt; t2.minute) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;交换a[]的i，j项&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; exchange(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _angle = a[i].angle;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _hour = a[i].hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _minute = a[i].minute;&lt;br /&gt;&lt;br /&gt;    a[i].angle = a[j].angle;&lt;br /&gt;    a[i].hour = a[j].hour;&lt;br /&gt;    a[i].minute = a[j].minute;&lt;br /&gt;&lt;br /&gt;    a[j].angle = _angle;&lt;br /&gt;    a[j].hour = _hour;&lt;br /&gt;    a[j].minute = _minute;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;选择排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; stopIndex: 当排序到索引stopIndex，即可停止排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SelectionSort(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; stopIndex)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, min;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;for(i = left; i &amp;lt; right; i++) //完整排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt;= stopIndex; i++)&lt;br /&gt;    {&lt;br /&gt;        min = i;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt;= right; j++)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(lessthan(a[j], a[min])) min = j;&lt;br /&gt;        exchange(a, i, min);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//以 &lt;/span&gt;&lt;span style="color: #008000;"&gt;0.5度 为单位（eg. 180 units = 90 度，720 units = 360 度）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetAngle(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; minute)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour2 = (hour &amp;gt; &lt;span style="color: #800080;"&gt;12&lt;/span&gt;) ? (hour - &lt;span style="color: #800080;"&gt;12&lt;/span&gt;) : hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a1 = &lt;span style="color: #800080;"&gt;60&lt;/span&gt; * hour2 + minute;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a2 = minute * &lt;span style="color: #800080;"&gt;12&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = a2 - a1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        result = -result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;gt; &lt;span style="color: #800080;"&gt;360&lt;/span&gt;)&lt;br /&gt;        result = &lt;span style="color: #800080;"&gt;720&lt;/span&gt; - result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, count;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;];&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            items[j].hour = ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; ) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br /&gt;                + ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; );&lt;br /&gt;            items[j].minute = ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt; + &lt;span style="color: #800080;"&gt;3&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; ) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br /&gt;                + ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;+&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; );&lt;br /&gt;            items[j].angle = GetAngle(items[j].hour, items[j].minute);&lt;br /&gt;        }&lt;br /&gt;        SelectionSort(items, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%02d:%02d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, items[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;].hour, items[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;].minute);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;(9). ZOL3191: Strange Clock (0.2)&lt;br /&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3191"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3191&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出时针的角度，输出该时刻处于几点钟。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('33e59efa-002e-4da2-a10e-9f821edba932')"&gt;&#xD;
&lt;div id="cnblogs_code_open_33e59efa-002e-4da2-a10e-9f821edba932" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hourBig, hourSmall;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bExactly; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注意 gcc 没有定义过 bool 类型&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; degree;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;degree);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(degree == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        bExactly = (degree - (degree / &lt;span style="color: #800080;"&gt;30&lt;/span&gt; * &lt;span style="color: #800080;"&gt;30&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        hourBig = (degree &amp;lt; &lt;span style="color: #800080;"&gt;120&lt;/span&gt; ? &lt;span style="color: #800080;"&gt;3&lt;/span&gt; : &lt;span style="color: #800080;"&gt;15&lt;/span&gt;) - (degree / &lt;span style="color: #800080;"&gt;30&lt;/span&gt;);&lt;br /&gt;        hourSmall = (hourBig == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) ? &lt;span style="color: #800080;"&gt;11&lt;/span&gt; : (hourBig - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bExactly)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Exactly %d o'clock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hourBig);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Between %d o'clock and %d o'clock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hourSmall, hourBig);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(10). ZOL3247: Hello World (0.3)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3247"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3247&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出一个点阵，要求输出字符图形（每一行输入由 5 个字节组成，代表一个字符，每个字节代表该字符的一列，即每个字符实际上7 * 5 像素，注意行和 bit 之间的对应关系，低位对应的是上方像素，高位对应下方像素，所有字节的最高位为 0，表示最后一行没有任何像素，注意最后一行不能输出一长串空格，而是要输出成空行即直接换行，否则将导致 PE），备注：可使用 strtol 把16进制字符串转换成整数。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e27cfd3e-e37b-45f8-981a-5f6ade39ff5e')"&gt;&#xD;
&lt;div id="cnblogs_code_open_e27cfd3e-e37b-45f8-981a-5f6ade39ff5e" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;80&lt;/span&gt;][&lt;span style="color: #800080;"&gt;5&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; CharToInt(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;F&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800080;"&gt;10&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; test_count, char_count, i, j, k, col;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;test_count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt;= test_count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;char_count);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; char_count; j++)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(k = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; k &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; k++)&lt;br /&gt;            {&lt;br /&gt;                map[j][k] = CharToInt( line[k*&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] ) * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; &lt;br /&gt;                    + CharToInt( line[k*&lt;span style="color: #800080;"&gt;3&lt;/span&gt;+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] );&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;output the string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Case %d:\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, i);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;j: rows index&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j &amp;lt; &lt;span style="color: #800080;"&gt;7&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(k = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; k &amp;lt; char_count; k++)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;输出一个字符的某一行（五列）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(col = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; col &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; col++)&lt;br /&gt;                     {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( map[k][col] &amp;amp; (&lt;span style="color: #800080;"&gt;1 &lt;/span&gt;&amp;lt;&amp;lt; j) )&lt;br /&gt;                            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                            printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                      }&lt;br /&gt;                      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符和字符之间的空列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(k &amp;lt; char_count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                 }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一行结束，换行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(11). ZOL3322: Who is older ? (0.1)&lt;br /&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3322"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3322&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出两个人的生日，比较年龄谁大，超级简单，直接比较字符串即可。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('45deb09a-ea76-4d2d-9fee-f494e79d162d')"&gt;&#xD;
&lt;div id="cnblogs_code_open_45deb09a-ea76-4d2d-9fee-f494e79d162d" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;36&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, result;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        line[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        result = strcmp(line, line + &lt;span style="color: #800080;"&gt;11&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javaman\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;cpcs\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;same\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(12). ZOL3487: Ordinal Numbers (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3487"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3487&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出一个数字，根据规则，给出其序数后缀表示。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('da91427d-553a-4435-b4f1-6559ce1d80c1')"&gt;&#xD;
&lt;div id="cnblogs_code_open_da91427d-553a-4435-b4f1-6559ce1d80c1" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetPostfix(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* line, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* postfix)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len = strlen(line);&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;十位上的字符&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(len &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        c = line[len-&lt;span style="color: #800080;"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the tens digit of a number is 1, then write&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"th" after the number. For example: 13th, 19th, 112th, 9311th. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;th&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the tens digit is not equal to 1, then use&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"st" if the units digit is 1, &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"nd" if the units digit is 2, &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"rd" if the units digit is 3, and &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"th" otherwise: &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;For example: 2nd, 7th, 20th, 23rd, 52nd, 135th, 301st. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;(line[len-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&lt;br /&gt;        {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;st&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;2&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;3&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:  strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;th&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;], postfix[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        GetPostfix(line, postfix);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line, postfix);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(13). ZOL3542: Hexadecimal View (0.1)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3542"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3542&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出一行字符串（全部是可打印字符），输出 16 进制视图。备注：字符大小写的互相转换也可使用 touppder / tolower 。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('d1e8ac15-5b7d-4361-bfdd-50f64c5722ff')"&gt;&#xD;
&lt;div id="cnblogs_code_open_d1e8ac15-5b7d-4361-bfdd-50f64c5722ff" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputHexView(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, linenum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len = strlen(s);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; linecount = (len + &lt;span style="color: #800080;"&gt;15&lt;/span&gt;)/&lt;span style="color: #800080;"&gt;16&lt;/span&gt;;  &lt;span style="color: #008000;"&gt;//需要打印的总行数&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(linenum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; linenum &amp;lt; linecount; ++linenum)&lt;br /&gt;    {&lt;br /&gt;        memset(line, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;16&lt;/span&gt;);&lt;br /&gt;        strncpy(line, p, &lt;span style="color: #800080;"&gt;16&lt;/span&gt;);&lt;br /&gt;        p += &lt;span style="color: #800080;"&gt;16&lt;/span&gt;;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%04x: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, (linenum &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) &amp;amp; &lt;span style="color: #800080;"&gt;0xffff&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"  &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;//没有字符（最后一行的 padding 部分）&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%02x&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;//每两个字符之间有一个空格间隔&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; line[i] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #008000;"&gt;// islower( line[i] )&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i] + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);    &lt;span style="color: #008000;"&gt;// toupper( line[i] )&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; line[i] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i] + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;// tolower;&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;4100&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( gets(line) != NULL )&lt;br /&gt;    {&lt;br /&gt;        OutputHexView(line);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(14). ZOL3317: Murder in Restaurant (0.3)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3317"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3317&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出一个旅馆的入住信息表，客人数和房间数，给出每个客人的试图入住日期和离店日期（都用整数表示），尝试给客人分配一个最小房号（从1开始计数）的房间，要求输出每个客人的入住房号，如果该客人来时没有房间则输出 0。&lt;/p&gt;&#xD;
&lt;p&gt;解法：把客人按照入住时间升序排序，然后依次分配房间号。（有些类似贪心法中的申请会议室）&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('9f4dad45-d774-4543-84c4-d8decd0f33c9')"&gt;&#xD;
&lt;div id="cnblogs_code_open_9f4dad45-d774-4543-84c4-d8decd0f33c9" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Rooms_Leave[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];      &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 每个元素表示第 i 个房间退房的日期 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Renters_RoomNo[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 每个元素分配给第 i 个客人的房间号 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; tagRENTER&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;客人索引（0 base）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; EnterDate; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;入住日期&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; LeaveDate; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;离店日期&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;} RENTER, *PRENTER;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;typedef&lt;/span&gt; RENTER Item;&lt;br /&gt;&lt;br /&gt;Item items[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; less_than(Item t1, Item t2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (t1.EnterDate &amp;lt; t2.EnterDate) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;交换a[]的i，j项&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; exchange(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i != j)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _index = a[i].index;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _EnterDate = a[i].EnterDate;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _LeaveDate = a[i].LeaveDate;&lt;br /&gt;&lt;br /&gt;        a[i].index = a[j].index;&lt;br /&gt;        a[i].EnterDate = a[j].EnterDate;&lt;br /&gt;        a[i].LeaveDate = a[j].LeaveDate;&lt;br /&gt;&lt;br /&gt;        a[j].index = _index;&lt;br /&gt;        a[j].EnterDate = _EnterDate;&lt;br /&gt;        a[j].LeaveDate = _LeaveDate;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;选择排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SelectionSort(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, min;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt; right; i++)&lt;br /&gt;    {&lt;br /&gt;        min = i;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt;= right; j++)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(less_than(a[j], a[min])) min = j;&lt;br /&gt;        exchange(a, i, min);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; renter_count, room_count, i, j;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;renter_count, &amp;amp;room_count);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(renter_count == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            Rooms_Leave[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            Renters_RoomNo[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            items[i].index = i;&lt;br /&gt;            scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;items[i].EnterDate, &amp;amp;items[i].LeaveDate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 给每个客人分配房间 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        SelectionSort(items, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, renter_count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; room_count; j++)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Rooms_Leave[j] &amp;lt;= items[i].EnterDate)&lt;br /&gt;                {&lt;br /&gt;                    Rooms_Leave[j] = items[i].LeaveDate;&lt;br /&gt;                    Renters_RoomNo[ items[i].index ] = j + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; output result &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Renters_RoomNo[i]);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(15). ZOL2850: Beautiful Meadow ( 0.1 )&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2850"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2850&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给出一个 N * M 的网格，每个 cell 的值是 0&amp;nbsp;或 1。如果所有 cell 都是1，或有任何为 0 的 cell 相邻（即共享某条边），则输出No，否则输出Yes。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e98b9745-63c5-4ee5-b407-dc417f128d85')"&gt;&#xD;
&lt;div id="cnblogs_code_open_e98b9745-63c5-4ee5-b407-dc417f128d85" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, col, i, j, tmp, sum;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bMowedAdjacent;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;row, &amp;amp;col);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(row == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        bMowedAdjacent = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        sum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; row; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; col; j++)&lt;br /&gt;            {&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;tmp);&lt;br /&gt;                map[i][j] = tmp;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(tmp == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[i][j-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                        bMowedAdjacent = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                        bMowedAdjacent = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                    sum += tmp;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bMowedAdjacent || sum == row * col) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Yes\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(16). ZOL1094: Matrix Chain Multiplication ( 0.3 )&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然题目是算法经典命题-矩阵乘法链，但是此题目考察的绝不是动态规划（DP），而是给出一个矩阵乘法加括号的表达式，求该方案所需的乘法运算数。如果矩阵乘法不相容，则输出 "error"。此题目的输入非常标准，无需考虑表达式的括号不匹配等问题。也无需考虑例如 "ABC" 这种没有加括号的表达式（输入一定给出的是 "((AB)C)" ）。如果是只有单个矩阵，则一定没有括号。这种输入的标准化使我们无需检测特殊情况（例如 "(A)", "ABC", ")AB" 等），可以仅仅用表达式中的括号去推动表达式的解析。&lt;/p&gt;&#xD;
&lt;p&gt;解法是：准备两个辅助栈，一个装入矩阵信息（操作数），一个装入括号（由于输入表达式一定括号匹配，因此第二个辅助栈实际上不需要，但为了保持逻辑完整性依然保留），每次遇到&amp;ldquo;）&amp;rdquo;符号，则从操作数栈中弹出两个矩阵，如果相容，则累加这两个矩阵相乘的代价，然后把结果信息 (row, col) 再次入栈。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('6a9c40cb-e94e-461c-bddc-21e9541eeec9')"&gt;&#xD;
&lt;div id="cnblogs_code_open_6a9c40cb-e94e-461c-bddc-21e9541eeec9" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagMatrixInfo&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col;&lt;br /&gt;} MatrixInfo;&lt;br /&gt;&lt;br /&gt;MatrixInfo matrix[&lt;span style="color: #800080;"&gt;26&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; szExpression: 形如"(A(BC))"; 返回值：乘法次数，-1 代表不相容 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetResult(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szExpression)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = szExpression;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; brackets[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;];   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 括号的栈 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pBrackets = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 栈顶指针 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    MatrixInfo nums[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 操作数栈 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pNums = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;       &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 栈顶指针 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row0, col0, row1, col1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回的结果：总乘法次数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        c = *p;&lt;br /&gt;        ++p;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; push in stack &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            ++pNums;&lt;br /&gt;            nums[pNums].row = matrix[c-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].row;&lt;br /&gt;            nums[pNums].col = matrix[c-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].col;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            brackets[++pBrackets] = c;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从栈中弹出两个操作数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            row0 = nums[pNums - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].row;&lt;br /&gt;            col0 = nums[pNums - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].col;&lt;br /&gt;            row1 = nums[pNums].row;&lt;br /&gt;            col1 = nums[pNums].col;&lt;br /&gt;            pNums -= &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            pBrackets--; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 弹出一个'(' &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 两个操作数是否相容？ &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(col0 != row1)&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            count += row0 * col0 * col1;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 结果信息 push 到操作数栈中 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            ++pNums;&lt;br /&gt;            nums[pNums].row = row0;&lt;br /&gt;            nums[pNums].col = col1;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; cNum, line[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;];&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;cNum);&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;matrix[cNum-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].row, &amp;amp;matrix[cNum-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].col);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL)&lt;br /&gt;    {&lt;br /&gt;        result = GetResult(line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, result);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2241914.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html</id><title type="text">ZOL1010（Area）解题报告</title><summary type="text">基本题意：此题目给出 n 个点的坐标（xi，yi），要求求出这些点围成的多边形面积。同时要求检测出不合法的多边形（例如非相邻边彼此相交的情况）。</summary><published>2011-11-04T13:17:00Z</published><updated>2011-11-04T13:17:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;ZOL 1010. Area.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;题目地址：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;基本题意：此题目给出 n 个点的坐标 (xi，yi ) ，要求求出这些点按顺序围成的多边形的面积。同时要求检测出不合法的多边形（例如非相邻边彼此相交的情况）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F1010%2F1010-2.jpg" alt="Figure of ZOL1010" width="152" height="140" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此题求面积不难，样例很容易就过了，但是提交 10+ 次基本都是 WA ，几乎失去信心。做题最郁闷的就是你不知道问题到底出在什么地方，可能改了很多次都没有试对地方。后来跑到 88 的算法版搜了下，看到别人的代码，然后事后总结实际还是卡在了什么样的多边形是 Impossible 的，这个检测代码没有写好，耐心不够导致。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（1）求面积很简单，类似求某个曲线的区间积分&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;用所有多边形的边和X轴围成的梯形的面积累加起来就可以了。例如某条边 ( P1 - P2 ) 和在它在 x 轴的投影 ( p1' - P2' ) 所围成的梯形面积是：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;S&amp;nbsp;&lt;/strong&gt;[ p1-&amp;gt;p2&amp;nbsp;] = &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( y1 + y2 ) * ( x2 - x1 ) ;　　&lt;span style="color: #008000;"&gt;----（I）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个式子拆开后就是：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;S &lt;/strong&gt;[ p1-&amp;gt;p2&amp;nbsp;] = &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( &lt;strong&gt;&lt;span style="color: #0000ff;"&gt;-x1 * y1 + x2 * y2&lt;/span&gt; - x1 * y2 + x2 * y1&lt;/strong&gt; ) ;&amp;nbsp; &lt;span style="color: #008000;"&gt;---- ( 注：蓝色部分的 xi * yi 累加后被消掉 )&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于每个边都被累加一遍，每个点参与了组成边两次（前一条边的终点和后一条边的起始点），所以每个顶点自身坐标的乘积 ( xi * yi ) 累加的时候都被消掉了！最后就是累加所有的式（I）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　　　Area&lt;/strong&gt; = &lt;strong&gt;&amp;sum;&lt;/strong&gt; &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( -&lt;strong&gt;x( i ) * y( i + 1 )&amp;nbsp; + x( i + 1 ) * y( i )&lt;/strong&gt; ) ;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;　&lt;/em&gt;&lt;span style="color: #008000;"&gt;----( i = 1,2,...,n，且P(n+1) = P(0) );　　　　 ----（II）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的式子，括号内是两个矢量的叉积&amp;nbsp;P[ i + 1 ] &amp;times; P[ i ]。因此式II实际上是依次累加相邻点的叉积，最后在除以2。考虑叉积的含义，是以两个矢量为相邻边的平行四边形（由 O(0,0), P1, P2, (P1 + P2) 四个点组成）的面积（在平面坐标中用三角形面积相减可以很容易推导出该含义），因此这个方法的物理意义就非常明显了，我们可以直观的假定原点位于多边形内部，显然依次把相邻点和原点围成的三角形的面积累加起来就是这些点组成的多边形的面积。因此 1/2 ( P[ i + 1&amp;nbsp;] X P[ i ] ) 就是三角形 O&amp;nbsp;- P[ i + 1 ] - P[ i ] 的面积（平行四边形面积的一半，O 表示原点）。当然，由于叉积有符号，所以原点位于多边形外部也成立，只是在内部更直观，更容易理解。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;备注：我们可以把存储顶点的数组扩充一个元素，然后把 P( n+1 ) 赋值为 P( 0 )，这样我们对上式的循环中就不必对顶点索引使用取模运算（MOD）。我自己写的代码采用的（I）这种计算方法，我参考的代码采用（II）中的计算方法，两者计算量相差不大，但后者不太直观，所以我就稍微解释了下两者本质是相同的。&lt;/p&gt;&#xD;
&lt;p&gt;注意式（I）中的梯形面积是有符号的，和 P1，P2 的点顺序相关( S[ p1-&amp;gt;p2&amp;nbsp;] = -S[ p2-&amp;gt;p1 ] ) ，因此 Area 的符号和顶点顺序有关，所以最后别忘了对计算结果求绝对值。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（2）麻烦在于，什么样的多边形是 Impossible 的&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;做题的时候肯定我们就会着重考虑这一点。因为不管任何多边形，按照（1）都能算出个面积，但是多边形是否是有效的需要单独判断。设多边形有 n 个顶点和边，则：&lt;/p&gt;&#xD;
&lt;p&gt;2.1） n &amp;lt; 3 时，显然是 Impossible，因为一个点或一个线段不能组成多边形。&lt;/p&gt;&#xD;
&lt;p&gt;2.2） n &amp;gt; 3 时，依次判断每条边 和 它的所有非相邻边 不能相交（包含交点位于某一条线段上的情况），保证这一点即可。&lt;/p&gt;&#xD;
&lt;p&gt;2.3） n = 3 时，是三角形，无须做 2.2 中的检测。&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;如果三角形的三个点共线的话，是不是应该输出 Impossible，我们没有考虑也 AC 了&lt;/span&gt; （即我们会对这种情况认为是有效的而输出 0.00），估计 OL平台的测试输入也没有考虑这种情况。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面我们考虑2.2中的检测：&lt;/p&gt;&#xD;
&lt;p&gt;总的边数为 n，则每条边的非相邻边为（n-3）条，所以检测完所有边的情况类似冒泡排序，以及绘制多边形所有顶点的连接线的金刚石图形，需要耗费O（n^2)的时间复杂度。&lt;/p&gt;&#xD;
&lt;p&gt;相邻边必然是相交于顶点的所以不用检测，即使相邻边向内重叠了，比如连续的三个顶点：（0，0），（0，5），（0，3）这种情况也不必担心，因为在下一条边检测时也会检测出相交情况的。&lt;/p&gt;&#xD;
&lt;p&gt;判断两个线段是否相交属于算法中的计算几何部分，主要原理是 &lt;span style="background-color: #ccffff; color: #0000ff;"&gt;如果两个线段相交，则从任何一个线段角度看，另一个线段的两个端点都位于它自己的两侧（该线段以任一端点为原点旋转到经过另一个线段的两个端点的时针方向相反）。&lt;/span&gt; 两个矢量的相对旋转方向利用矢量叉积求出。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;我原来还考虑了浮点数和 0 的比较判断，实际上最后从提交结果发现无需考虑这个问题，直接和 0 比就是了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（3）对顶点坐标的存储&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;为了检测多边形是不是Impossible的，就必须要存储所有顶点的坐标。如果不需要判断这个，就不需要任何额外的存储空间。那样就简洁多了。当然那样的话这道题也就毫无任何难度，也失去了对计算几何的考察点。&lt;/p&gt;&#xD;
&lt;p&gt;我看了我参考的解法，我居然没有想到像他开一个维度为1000的数组，ft！我是用了一个链表来存储所有的边。。。。汗。。。（当然应该用STL就可以，我习惯了自己写链表的代码），所以我的代码比我参考的那个人的多好多。。。（他的代码好简短！）&lt;/p&gt;&#xD;
&lt;p&gt;另外，由于我用链表存储的是线段，相当于每个顶点被我存储了两次，所以实际上还是浪费了一倍的堆上内存。另外还要加上链表使用的指针占用的空间。当然优点是动态内存管理相比静态数组在内存的使用上要灵活一些，这就无须多做解释了。&lt;/p&gt;&#xD;
&lt;p&gt;检测边是否相交实际上和那个人的代码的原理基本一致，这部分代码我基本是照着《算法导论》上的伪码直译过来的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;我提交的代码如下：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8109df70-4763-410a-a1ef-8b784ad0fcbc')"&gt;&#xD;
&lt;div id="cnblogs_code_open_8109df70-4763-410a-a1ef-8b784ad0fcbc" &gt;&#xD;
&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;#define ZEROVALUE 0.00000000000001&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#ifndef __max&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __max(a,b)  (((a) &amp;gt; (b)) ? (a) : (b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#ifndef __min&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __min(a,b)  (((a) &amp;lt; (b)) ? (a) : (b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _LINE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2;&lt;br /&gt;    _LINE* pNext;&lt;br /&gt;} LINE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;以Pi为原点，从 PiPj 到 PiPk 的方位（返回值的符号表示顺时针 or 逆时针）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; Direction(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yi, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;原点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yj, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段1结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yk) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段2结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (xk - xi) * (yj - yi) - (xj - xi) * (yk - yi);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//如果点 Pk 位于线段 PiPj &lt;/span&gt;&lt;span style="color: #008000;"&gt;所在直线上，则它是否位于该线段内&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OnSegment(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yi,  &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yj, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段1结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yk) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段2结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(xk &amp;gt;= __min(xi, xj) &amp;amp;&amp;amp; xk &amp;lt;= __max(xi, xj)&lt;br /&gt;        &amp;amp;&amp;amp; yk &amp;gt;= __min(yi, yj) &amp;amp;&amp;amp; yk &amp;lt;= __max(yi, yj))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;判断两个线段P1P2，P3P4&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; intersect(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x3, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y3,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x4, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y4)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d1 = Direction(x3, y3, x4, y4, x1, y1);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d2 = Direction(x3, y3, x4, y4, x2, y2);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d3 = Direction(x1, y1, x2, y2, x3, y3);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d4 = Direction(x1, y1, x2, y2, x4, y4);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(    ((d1 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d2 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) || (d1 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d2 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;))&lt;br /&gt;        &amp;amp;&amp;amp; ((d3 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d4 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) || (d3 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d4 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)) )&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d1 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x3, y3, x4, y4, x1, y1))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d2 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x3, y3, x4, y4, x2, y2))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d3 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x1, y1, x2, y2, x3, y3))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d4 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x1, y1, x2, y2, x4, y4))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绝对不相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 增加线段到链表尾部 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddLine(LINE** ppHead, LINE** ppTail,&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2)&lt;br /&gt;{&lt;br /&gt;    LINE *pNode = (LINE*)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(LINE));&lt;br /&gt;    pNode-&amp;gt;pNext = NULL;&lt;br /&gt;    pNode-&amp;gt;x1 = x1;&lt;br /&gt;    pNode-&amp;gt;y1 = y1;&lt;br /&gt;    pNode-&amp;gt;x2 = x2;&lt;br /&gt;    pNode-&amp;gt;y2 = y2;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*ppTail != NULL)&lt;br /&gt;    {&lt;br /&gt;        (*ppTail)-&amp;gt;pNext = pNode;    &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNode;&lt;br /&gt;    }&lt;br /&gt;    *ppTail = pNode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeList(LINE** ppHead, LINE** ppTail)&lt;br /&gt;{&lt;br /&gt;    LINE* pNode = (*ppHead);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode != NULL)&lt;br /&gt;    {&lt;br /&gt;        LINE* tmp = pNode-&amp;gt;pNext;&lt;br /&gt;        free(pNode);&lt;br /&gt;        pNode = tmp;&lt;br /&gt;    }&lt;br /&gt;    *ppHead = NULL;&lt;br /&gt;    *ppTail = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 检查是否这一系列点围成的多边形是否合法 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CheckValid(LINE* pHead)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 当前正循环到的边的索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    LINE* pCur = pHead;&lt;br /&gt;    LINE* pTest;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur != NULL)&lt;br /&gt;    {&lt;br /&gt;        pTest = NULL;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCur-&amp;gt;pNext != NULL)&lt;br /&gt;            pTest = pCur-&amp;gt;pNext-&amp;gt;pNext;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pTest != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;最后一条边(n-1) -- (0)，不与第一条边 (0) -- (1) 检测&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; pTest-&amp;gt;pNext == NULL)&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 非相邻边相交？ &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(intersect(pCur-&amp;gt;x1, pCur-&amp;gt;y1, pCur-&amp;gt;x2, pCur-&amp;gt;y2,&lt;br /&gt;                pTest-&amp;gt;x1, pTest-&amp;gt;y1, pTest-&amp;gt;x2, pTest-&amp;gt;y2))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            pTest = pTest-&amp;gt;pNext;&lt;br /&gt;        }&lt;br /&gt;        pCur = pCur-&amp;gt;pNext;&lt;br /&gt;        ++index;&lt;br /&gt;    }    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    LINE *pHead = NULL, *pTail = NULL;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, n = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, figure = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x0, y0, x1, y1, x2, y2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; area = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;int test = intersect(0, 1, 1, 0, 1, -1, 0, 0.5);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打印一个空行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(figure &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        area = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf %lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x0, &amp;amp;y0);&lt;br /&gt;        x1 = x0;&lt;br /&gt;        y1 = y0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt;= n; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; n)&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf %lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x2, &amp;amp;y2);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                x2 = x0;&lt;br /&gt;                y2 = y0;&lt;br /&gt;            }&lt;br /&gt;            area += (y1 + y2) * (x2 - x1) * &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            AddLine(&amp;amp;pHead, &amp;amp;pTail, x1, y1, x2, y2);&lt;br /&gt;&lt;br /&gt;            x1 = x2;&lt;br /&gt;            y1 = y2;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(area &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            area *= -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!CheckValid(pHead))&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: %.02lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure, area);&lt;br /&gt;&lt;br /&gt;        FreeList(&amp;amp;pHead, &amp;amp;pTail);&lt;br /&gt;&lt;br /&gt;        figure++;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;另附上我参考的代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('38740d40-c89f-44e8-ae7b-54990ec10a27')"&gt;&#xD;
&lt;div id="cnblogs_code_open_38740d40-c89f-44e8-ae7b-54990ec10a27" &gt;&#xD;
&lt;pre&gt;发信人: dynamic (programming@math), 信区: ACMICPC&lt;br /&gt;标  题: Re: 1010里的错误多边形有多少可能性？&lt;br /&gt;发信站: 逸仙时空 Yat-sen Channel (Wed Apr  &lt;span style="color: #800080;"&gt;9&lt;/span&gt; &lt;span style="color: #800080;"&gt;20&lt;/span&gt;:&lt;span style="color: #800080;"&gt;55&lt;/span&gt;:&lt;span style="color: #800080;"&gt;07&lt;/span&gt; &lt;span style="color: #800080;"&gt;2003&lt;/span&gt;), 站内信件&lt;br /&gt;&lt;br /&gt;我的程序&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;zju 1010&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;by dynamic&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;on sunday july 28th&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; det(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x3,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y3)&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x1*y2+x2*y3+x3*y1-x2*y1-x3*y2-x1*y3;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n,i,j,count=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,temp;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x[&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;],y[&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;],area;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;amp;n);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (n==&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                count++;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (count&amp;gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,count);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++) scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf%lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;amp;x[i],&amp;amp;y[i]);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (n&amp;lt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;){&lt;br /&gt;                        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++)&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j=(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)/n;j&amp;lt;i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;j++){&lt;br /&gt;                                temp=(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n;&lt;br /&gt;                                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (det(x[j],y[j],x[i],y[i],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])*det(x[j],y[j],x[temp],y[temp],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&amp;lt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;amp;&amp;amp;&lt;br /&gt;                                        det(x[i],y[i],x[j],y[j],x[temp],y[temp])*det(x[i],y[i],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],x[temp],y[temp])&amp;lt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;                                        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                                        &lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt; &lt;span style="color: #800080;"&gt;quit&lt;/span&gt;;&lt;br /&gt;                                }&lt;br /&gt;                         }&lt;br /&gt;                area=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++){&lt;br /&gt;                        area+=x[i]*y[(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n];&lt;br /&gt;                        area-=y[i]*x[(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n];&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (area&amp;lt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) area*=-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.2lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,area/&lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #800080;"&gt;&lt;strong&gt;quit&lt;/strong&gt;&lt;/span&gt;:;&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. 《算法导论》，第33章（计算几何学）33.1 节（线段的性质）。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2236627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/07/10/2102106.html</id><title type="text">修改 EXE 文件的图标</title><summary type="text">【关键字】VC++，修改EXE文件的图标。本文讲解的是修改EXE文件（可执行文件）的图标，可以看做是我写PE文件的Directoried相关文章的一个后续应用。在很多年前很著名的熊猫烧香病毒，就有这样一个行为，是搜索硬盘上的可执行文件并感染它们，其典型外观症状就是程序的图标变成了熊猫烧香。</summary><published>2011-07-09T19:16:00Z</published><updated>2011-07-09T19:16:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/07/10/2102106.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/07/10/2102106.html"/><content type="html">&lt;p&gt;【关键字】VC++，修改EXE文件的图标&lt;/p&gt;&#xD;
&lt;p&gt;在很多年前很著名的熊猫烧香病毒，就有这样一个行为，是搜索硬盘上的可执行文件并感染它们，其典型外观症状就是程序的图标变成了熊猫烧香。本文讲解的是修改EXE文件（可执行文件）的图标，可以看做是我写PE文件的Directoried相关文章的一个后续应用，本文性质属于技术可行性研究。考察下windows系统上的文件可以发现下面的特征：&lt;/p&gt;&#xD;
&lt;p&gt;（1）应用程序的可执行文件可以有自己定义的图标，通常位于其资源中，资源管理器使用资源中的图标显示它们，如果没有资源，就显示成系统默认的可执行文件图标。&lt;/p&gt;&#xD;
&lt;p&gt;（2）DLL中虽然可以含有图标资源，但系统一律都是用统一的DLL图标去显示他们。&lt;/p&gt;&#xD;
&lt;p&gt;（3）快捷方式的图标可以随意指定来源，通常是来自其指向的目标文件。用户可以随意修改快捷方式的图标。&lt;/p&gt;&#xD;
&lt;p&gt;（4）就是系统中注册的文档类型，比如doc，txt等等后缀名的文件，其图标是注册在注册表中的，通常也就是来自于打开他们的默认程序中。&lt;/p&gt;&#xD;
&lt;p&gt;再考察下上面的四种显示的图标，其中（2）取决于系统，无法修改也没有必要修改。（1）的图标修改比较困难，因为必须修改PE文件本身，我们通常需要借助专门的资源编辑工具（例如vs.net）打开才能修改。本文讲述的是修改（1）也就是EXE文件的图标。&lt;/p&gt;&#xD;
&lt;p&gt;现在介绍一下我的代码的原理，就是图标是多个图像组成的，每个图像的数据被存放在PE文件中。我在PE文件中定位到这些数据，然后用用户选择的其他图标数据，把这里的数据覆盖。这样PE文件里的图标就被彻底换掉了。我在这里并未校验内存是否写越界，因为如果不出意外，我替换的是标准图标，（通常索引图像的调色板都是满的，比如4bpp的图像调色板是16个颜色，8bpp的图像调色板是256个颜色），所以基本不会发生越界导致破坏PE文件的问题。由于只改动图标，所以PE文件修改后依然能正常运行。为了防止意外，在修改之前我会对PE文件进行备份。还原时就用备份的文件重新覆盖回来即可。&lt;/p&gt;&#xD;
&lt;p&gt;下图显示的是用我写的工具查看 PE 文件的一些Directory，用它打开windows的记事本程序，可以看到记事本文件中的图标在PE文件的资源表中的位置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011071002350639.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意，图标节点（Icon）是位于第一级子结点深度，其 Entry.Id 为 3。下面含有多个子结点，每一个子结点都是一个图像，每个子结点到达叶子以后，就是图像数据，它们由三部分组成，分别是 BitmapInfoHeader ， 调色板（如果是索引图像）， XOR Mask 数据， AND Mask 数据（Mask 数据的扫描行宽度都必须以 4 Bytes 对齐）。如果你熟悉&amp;nbsp;ICO 的文件格式，这里就不用我介绍了，可以参考 ICO 文件格式的资料。&lt;/p&gt;&#xD;
&lt;p&gt;当我定位到这里以后，剩下的任务就是把这里的数据替换掉。为此，我把PE文件的内容先整体加载到内存中，然后定位到图像数据，并用已经选择的一个图标尝试替换其数据，这里我使用的方法是，用户选择的图标中的图像，比如和PE文件中的图像一致才替换，所谓一致，是指三个数据的完全相同（宽度，高度，位深度），实际上如果用户选择的图标图像（复制的源）如果小于被覆盖的数据的大小，是没有问题的，即相当于PE文件中在图像数据后面会有一些字节成了无用的垃圾数据），比如我们用 32 * 32， 8 BPP 的图像数据 覆盖掉 48 * 48， 8 BPP 的数据是不会出问题的，但是这里我们也应该同时修改 GroupIcon 中的图标高度和宽度信息，以和实际图像数据相符。但反过来，如果用大数据覆盖小数据是绝对不行的，因为我们绝对不能在超出我们已知内容的范围以外去写东西，那将可能产生对PE文件的破坏，甚至使他无法运行。&lt;/p&gt;&#xD;
&lt;p&gt;每个Icon节点下面还有一层&amp;ldquo;语言&amp;rdquo;目录，然后才到达真正的叶子节点（即图像的BitmapInfoHeader入口处）。所以这里我依然使用一个递归函数去找到最终的叶子节点，然后用 memcpy 覆写这里的数据。最后，我们把整个PE文件重写保存到硬盘上即可。&lt;/p&gt;&#xD;
&lt;p&gt;这里提供关键代码，即以下两个函数，在第一个函数中，我使用了 ImageRvaToVa 去在PE文件中定位到相应的数据结构（例如Directory）的地址。下面代码中有很多对返回值的校验等，所以显得比较杂乱些。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('aee61ff3-2ab6-4798-bdf2-1b5398a372c8')"&gt;&#xD;
&lt;div id="cnblogs_code_open_aee61ff3-2ab6-4798-bdf2-1b5398a372c8" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;换图标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;BOOL ChangeIcon(HWND hDlg)&lt;br /&gt;{&lt;br /&gt;TCHAR szPath_App[MAX_PATH];&lt;br /&gt;TCHAR szPath_Ico[MAX_PATH];&lt;br /&gt;&lt;br /&gt;GetDlgItemText(hDlg, IDC_EDIT_APPPATH, szPath_App, MAX_PATH);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_tcslen(szPath_App) &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;请输入程序的路径&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;GetDlgItemText(hDlg, IDC_EDIT_ICOPATH, szPath_Ico, MAX_PATH);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_tcslen(szPath_Ico) &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;请输入图标的路径&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;先把程序全部读入内存&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;HANDLE hFile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateFile(szPath_App, &lt;br /&gt;GENERIC_READ,&lt;br /&gt;FILE_SHARE_READ,&lt;br /&gt;NULL,&lt;br /&gt;OPEN_EXISTING,&lt;br /&gt;FILE_ATTRIBUTE_NORMAL,&lt;br /&gt;NULL);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hFile &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;打开程序文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD dwBytesRead &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;DWORD dwAppFileSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetFileSize(hFile, NULL);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PBYTE lpBaseAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PBYTE)malloc(dwAppFileSize);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(lpBaseAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL)&lt;br /&gt;{&lt;br /&gt;CloseHandle(hFile);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;内存不足。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;ReadFile(hFile, lpBaseAddress, dwAppFileSize, &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dwBytesRead, NULL) &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; dwBytesRead &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dwAppFileSize)&lt;br /&gt;{&lt;br /&gt;CloseHandle(hFile);&lt;br /&gt;free(lpBaseAddress);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;读取APP文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;CloseHandle(hFile); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;关闭文件&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 加载图标&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;g_IcoFile.LoadFile(szPath_Ico))&lt;br /&gt;{&lt;br /&gt;free(lpBaseAddress);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;读取ICO文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;现在准备路径&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TCHAR szPath_AppBackup[MAX_PATH];&lt;br /&gt;TCHAR szPath_AppModified[MAX_PATH];&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;TCHAR szDriver[4], szDir[MAX_PATH], szFilename[MAX_PATH], szExt[8];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;_tsplitpath(szPath_App, szDrive, szDir, szFilename, szExt);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;_stprintf(szPath_AppBackup, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s.Backup&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), szPath_App);&lt;br /&gt;_stprintf(szPath_AppModified, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s.Modified&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), szPath_App);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;CopyFile(szPath_App, szPath_AppBackup, TRUE))&lt;br /&gt;{&lt;br /&gt;free(lpBaseAddress);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;备份APP文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在内存中替换 ICON （覆写内存数据）&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; totalImgCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, replacedImgCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;PIMAGE_DOS_HEADER pDosHeader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_DOS_HEADER)lpBaseAddress;&lt;br /&gt;PIMAGE_NT_HEADERS pNtHeaders &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_NT_HEADERS)(lpBaseAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDosHeader&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;e_lfanew);&lt;br /&gt;&lt;br /&gt;BOOL bFindIcon &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;资源表的rva&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DWORD rva_resTable &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pNtHeaders&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(rva_resTable &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this-&amp;gt;LoadResTable(lpBaseAddress, pNtHeaders, rva_resTable);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PIMAGE_RESOURCE_DIRECTORY pResTable &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY)ImageRvaToVa(&lt;br /&gt;pNtHeaders, &lt;br /&gt;lpBaseAddress,&lt;br /&gt;rva_resTable,&lt;br /&gt;NULL);&lt;br /&gt;&lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResTable &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(IMAGE_RESOURCE_DIRECTORY));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;寻找 Icon 子节点（在第一层上）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; (pResTable&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfNamedEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pResTable&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfIdEntries); i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this-&amp;gt;AddChildNode(hItem_Res, lpBaseAddress, pNtHeaders, (DWORD)pResTable, pEntries + i, 1);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;pEntries[i].NameIsString &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; pEntries[i].Id &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到了Icon？&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;bFindIcon &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 现在遍历每个Icon 并尝试替换叶子节点上的图标数据&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;DWORD tableAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DWORD)pResTable;&lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY pDir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY)(tableAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pEntries[i].OffsetToDirectory);&lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntries_Icon &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pDir &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(IMAGE_RESOURCE_DIRECTORY));&lt;br /&gt;&lt;br /&gt;totalImgCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfNamedEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfIdEntries;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; totalImgCount; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;OverwriteIcon(lpBaseAddress, pNtHeaders, tableAddress, pEntries_Icon &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; j, &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;replacedImgCount);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;bFindIcon)&lt;br /&gt;{&lt;br /&gt;free(lpBaseAddress);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;程序文件中没有图标，所以无须替换。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;保存到修改后的内容到 APP.exe.Modified&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;HANDLE hFile2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateFile(szPath_AppModified, &lt;br /&gt;GENERIC_WRITE,&lt;br /&gt;FILE_SHARE_READ,&lt;br /&gt;NULL,&lt;br /&gt;CREATE_ALWAYS,&lt;br /&gt;FILE_ATTRIBUTE_NORMAL,&lt;br /&gt;NULL);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hFile2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt;free(lpBaseAddress);&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;保存修改后的程序文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD dwBytesTotal &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dwAppFileSize;&lt;br /&gt;DWORD dwBytesToWrite &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, dwBytesWritten &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;PBYTE pBytePos &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; lpBaseAddress;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;(dwBytesTotal &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;dwBytesToWrite &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; min(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;, dwBytesTotal);&lt;br /&gt;WriteFile(hFile2, pBytePos, dwBytesToWrite, &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dwBytesWritten, NULL);&lt;br /&gt;dwBytesTotal &lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dwBytesToWrite;&lt;br /&gt;pBytePos &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dwBytesToWrite;&lt;br /&gt;}&lt;br /&gt;CloseHandle(hFile2);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;释放内存&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;free(lpBaseAddress);&lt;br /&gt;lpBaseAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;&lt;br /&gt;&lt;br /&gt;g_IcoFile.Clear();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;CopyFile(szPath_AppModified, szPath_App, FALSE))&lt;br /&gt;{&lt;br /&gt;MessageBox(hDlg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;替换程序文件失败。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;warning&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONWARNING);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DeleteFile(szPath_AppModified);&lt;br /&gt;&lt;br /&gt;TCHAR szMsg[&lt;/span&gt;&lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;_stprintf(szMsg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;替换程序图标成功! \r\n其中图像总数 %ld 个，成功替换 %ld 个。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), &lt;br /&gt;totalImgCount, replacedImgCount);&lt;br /&gt;MessageBox(hDlg, szMsg, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;success&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), MB_OK &lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt; MB_ICONINFORMATION);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;【递归函数】一个Icon的子结点，但不是叶子节点，递归到叶子节点后进行数据覆盖&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OverwriteIcon(LPVOID lpBaseAddress, &lt;br /&gt;PIMAGE_NT_HEADERS pNtHeaders, &lt;br /&gt;DWORD tableAddress, &lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntry,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pReplacedCount)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;再确定节点类型（目录还是叶子）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DataIsDirectory)&lt;br /&gt;{&lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY pDir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY)(tableAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;OffsetToDirectory);&lt;br /&gt;PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pDir &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(IMAGE_RESOURCE_DIRECTORY));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfNamedEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NumberOfIdEntries); i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;OverwriteIcon(lpBaseAddress, pNtHeaders, tableAddress, pEntries &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, pReplacedCount);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;已经叶子节点！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PIMAGE_RESOURCE_DATA_ENTRY pDataEntry &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PIMAGE_RESOURCE_DATA_ENTRY)(tableAddress &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; pEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;OffsetToData);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;具体的资源属于位于：pData-&amp;gt;OffsetToData，这是一个RVA（不是相对于资源表头部的偏移！！！）&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;去定位到实际的资源数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;PBYTE lpIconData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PBYTE)ImageRvaToVa(pNtHeaders, lpBaseAddress, pDataEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;OffsetToData, NULL);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;_stprintf(nodeText, _T("FileAddr: %08X; RVA: %08X; Size = %ld Bytes; "), &lt;br /&gt;pData - (DWORD)lpBaseAddress,&lt;br /&gt;pDataEntry-&amp;gt;OffsetToData, &lt;br /&gt;pDataEntry-&amp;gt;Size);&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;PBITMAPINFOHEADER pBmInfoHdr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PBITMAPINFOHEADER)lpIconData;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; imgIndex &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; g_IcoFile.GetImageIndex(pBmInfoHdr&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;biWidth, pBmInfoHdr&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;biHeight, pBmInfoHdr&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;biBitCount);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(imgIndex &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;覆盖BitmapInfoHeader部分&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytesCopy &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(BITMAPINFOHEADER) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; g_IcoFile.m_pImages[imgIndex].nPaletteSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(RGBQUAD);&lt;br /&gt;memcpy(lpIconData, g_IcoFile.m_pImages[imgIndex].lpInfo, bytesCopy);&lt;br /&gt;lpIconData &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytesCopy;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;覆盖XOR Mask部分&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;bytesCopy &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; g_IcoFile.m_pImages[imgIndex].nSize_XOR;&lt;br /&gt;memcpy(lpIconData, g_IcoFile.m_pImages[imgIndex].lpXOR, bytesCopy);&lt;br /&gt;lpIconData &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytesCopy;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;覆盖And Mask部分&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;bytesCopy &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; g_IcoFile.m_pImages[imgIndex].nSize_AND;&lt;br /&gt;memcpy(lpIconData, g_IcoFile.m_pImages[imgIndex].lpAND, bytesCopy);&lt;br /&gt;lpIconData &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytesCopy;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;增加替换图像数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;pReplacedCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;pReplacedCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;下面是该Demo程序的截图：点击替换图标按钮后，尝试替换，替换后程序依然可以正常执行，并未对程序本身有其他任何破坏作用。点击还原按钮，用于还原成原来的EXE文件。当然，由于重要系统文件有系统服务进行文件保护，所以通常不能替换。可以选择一些不重要的EXE文件进行测试，并且本程序仅修改的是 EXE 在资源管理器里的视图图标。而程序运行起来以后的图标（例如标题栏，系统托盘等图标可能是运行时设置，其来源也可能不位于被修改的PE文件，例如来自其他DLL，则这些运行时图标是未能替换的，除非你找到了它们的所在并真正换掉了它们）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011071003014162.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在本范例中，我同时使用了我在 Photoshop ICO 文件格式插件中编写的一个类（CIcoFile），它早期也曾用于图像文件数据查看器，在本例中用于加载 ICO 文件。&lt;/p&gt;&#xD;
&lt;p&gt;下面是本范例程序的完整源码下载连接，为了方便测试，我同时提供了一个含有多个图像（从 128 * 128 到 16 * 16 ）的绿色小青蛙的 ICO 文件，位于Debug输出目录。以下源码由VS2005，使用VC++，Win32 SDK开发（无MFC）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/ChgAppIcon.rar"&gt;http://files.cnblogs.com/hoodlum1980/ChgAppIcon.rar&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　　　--------------------------------------------&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　　　【后续补充】: 一个方便查找图标来源的小工具 -- ListIcons&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　　　&lt;/strong&gt;在开发完成 Photoshop ICO 格式插件后，我发现有一个不方便的地方，就是如果一个程序下面包含的 DLL 和 EXE 比较多，那么就很难确定到底图标位于那个文件中，如果一个一个打开来试验，显然效率很低。在文本范例中，我提到了如果要修改某些图标，必须找到它们位于何处。如果我们知道这个图标来自哪里（哪个DLL/EXE文件），哪么我们根据资源表的结构就可以很方便的定位到其数据，然后有针对性的修改它。（我在这个范例中是暴力的一股脑的把一个PE文件中的所有图标都替换掉了）。因此我又开发了下面这个工具。&lt;/p&gt;&#xD;
&lt;p&gt;这个工具可以打开一个文件夹，然后尝试在这个文件夹下面的所有PE文件中查找图标，并加载到一个ListView（根据来自的文件启用了分组）中显示出来。由于需要ListView的分组功能，因此操作系统要求在WinXP以上。如下图所示是我加载 XP 系统的 system32 文件夹下的所有PE文件中的图标：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/22214/2011081118364768.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过这个工具可以更快的找到图标的位置。在这里我没有实现把图标导出的功能，如果你需要导出图标，可以使用 ICONPRO 或者我开发的 PS ICO 插件（当然使用该插件需要先安装Photoshop）。&lt;/p&gt;&#xD;
&lt;p&gt;为了效率考虑，我在实现这个工具时，没有递归遍历子文件夹。也就是说，程序只会尝试加载用户选定的文件夹根目录下的文件。如果下面的文件过多，例如 system32 下面有 1700 多个 PE 文件，这时我会启用多线程，为用户显示一个进度条对话框。&lt;/p&gt;&#xD;
&lt;p&gt;该工具的源码和编译版本下载连接如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/ListIcons.rar"&gt;http://files.cnblogs.com/hoodlum1980/ListIcons.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;--hoodlum1980， ON 2011-8-11。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;【补充：已知问题 (已解决) 】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;　　　　&lt;/strong&gt;&lt;span style="color: #000000;"&gt;ListIcons 工具中使用 &lt;strong&gt;CreateIconFromResource&lt;/strong&gt; 函数创建一个图标后，会产生 GDI 对象泄露，具体原因不详。根据 MSDN 的描述，暂时没有找到产生 GDI 对象泄露的原因。该问题导致反复添加含有大量图标的文件夹时，系统会显示异常。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;　　　　而且MSDN上的例子 ICONPRO 也有该 GDI 对象泄露问题（只是这个问题不显著而已，只要不停切换导入图标对话框上的选中图标，即可看到GDI对象个数缓慢上升到 10000 ）。看来这个问题是由 &lt;strong&gt;CreateIconFromResource&lt;/strong&gt; 这个 API 函数引入的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;　　　　&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;【补充2：对GDI对象泄露的问题的解决】&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;　　　　&lt;span style="color: #000000;"&gt;经过我的研究发现，实际上GDI对象泄露的现象是由于 CreateIconFromResource 这个函数默认的把图标当作 Shared 方式导致的，一旦图标被其他进程用&amp;ldquo;共享&amp;rdquo;方式获取（备注：&lt;span style="color: #800080;"&gt;&lt;strong&gt;"共享" &lt;/strong&gt;&lt;/span&gt;在此处的含义是指多个进程创建、获取、申请和使用的对象在底层上是 &lt;span style="color: #800080;"&gt;&lt;strong&gt;同一个对象 &lt;/strong&gt;&lt;/span&gt;），哪么这个进程不管是否调用 DestroyIcon 之类的函数都是不起作用的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　我估计，系统可能把共享方式的图标当作&amp;ldquo;长期使用&amp;rdquo;的，也就是可能多个进程都需要频繁的使用他们，因此共享方式的GDI对象不会被释放。这对于系统级别的GDI对象是有意义的，例如 GetStockObject 等获取到的 GDI 对象（例如白色话刷，黑色画笔等）实际上是长期在系统中生存的。这是由于这些对象的使用非常频繁，因此长期持有他们可以节省系统运行时效率。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　因此，共享方式的潜在要求是：程序通过共享方式申请或创建得到的GDI对象的数量不宜太多（备注：不要太多，根据 GDI 对象达到 10000 以后即造成系统绘制异常考虑，这里我认为数量在1000以下是可以的，当然这还和具体环境有关），如果太多，本质上等同于 GDI 对象泄露。因为共享对象是当进程退出时才被释放。所以小批量的共享对象不会产生问题，但是大批量（成百上千）的共享 GDI 对象持有在某个进程中，并随着运行持续增加，（当GDI对象达到和接近10000时）则一定会导致如同 GDI 对象泄露所产生的系统无法正常绘制的现象（例如弹出的菜单背景呈现黑色，标题栏等界面元素无法正常重绘等，这可能是由于系统无法成功创建新的 GDI 对象资源导致的）。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　而 CreateIconFromResource 这个函数无法指定不用 Shared 方式创建图标，换句话说，这个API创建的图标一定是 Shared 方式的，即使你已经调用 FreeLibary 释放了相应的 Module， 这些对象依然在你的进程中存在。因此当大批量的从大量 DLL 中加载图标时，就会产生GDI对象泄露的现象。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　对这个问题的解决办法时，改用其他 API 函数创建图标，这里我使用的是 LoadImage 函数。这个函数的最后一个参数是一个 Flag，可以指定 LR_SHARED 标志，即相当于共享方式，适用于需要频繁加载的对象（不释放）。如果在代码中指定了 LR_SHARED ，则同样会产生 CreateIconFromResource 遇到的问题。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;　　　　因此解决方法是，把 CreateIconFromResouce 函数换成 LoadImage，并一定不要使用 LR_SHARED 标志。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;　　　　但在MSDN中指出，某些图标如果不用 Shared 方式加载，则不会加载成功。因此我在代码中先用非共享方式加载图像，如果失败，再尝试用一次共享方式。但测试发现，还没有发现这种比较特殊的只能用共享方式加载的图标。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其他事项：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;　　　　有的资源中的图标不包含任何图像，因此不管用什么 API 和方法都无法导出，例如：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　　　&amp;nbsp;c:\windows\system32\ieframe.dll&amp;nbsp;&amp;nbsp; 中 ID 为 101,104,108,109,114,115,117&lt;br /&gt;&amp;nbsp;　　　　c:\windows\system32\shdocvw.dll 中 ID 为 101,104,107,108,109,114,115,117&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;【补充3】关于程序标题栏图标的说明&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般程序在资源管理器中显示的静态图标，是位于其PE文件中的Icon。而程序运行起来以后，在标题栏以及任务栏按钮左侧也会有一个图标，这个即是运行时的图标，通常可以通过 SetIcon 设置这个图标，系统用这个图标绘制到标题栏上。因此，只要找到这些图标的位置，我们就可以修改标题栏和任务栏按钮上的图标。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但对有一种情况是例外的，即不是系统绘制的非客户区（NC）。例如，完全 DirectUI 的窗口，其整个窗口都是用户自己绘制的，这种窗口容易观察出来，因为这些窗口在外观上会体现的比较个性化，和系统中的统一外观有所不同。这样我们可能无法替换其&amp;ldquo;标题栏图标&amp;rdquo;，因为其可能是&amp;ldquo;伪标题栏&amp;rdquo;。用户自己绘制，当然不一定要使用一个 Icon。如果不是Icon，哪么我想很可能是使用了其他 Bitmap 图像资源，或者是从自带的一些图片文件在运行时加载的。因此这种情况下，即无法使用替换 Icon 的方式改变图标。（本质原因是因为非系统绘制）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;系统标题栏的一个特征是：标题栏图标是一个点击区域，在标题栏图标上 &lt;span style="color: #0000ff;"&gt;&lt;strong&gt;左键 &lt;/strong&gt;&lt;/span&gt;单击（或者在标题栏的非图标区域 &lt;span style="color: #0000ff;"&gt;&lt;strong&gt;右键 &lt;/strong&gt;&lt;/span&gt;单击）会弹出系统菜单。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;-- hoodlum1980 2011-8-22。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2102106.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/07/10/2102106.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/06/24/2089267.html</id><title type="text">[发布] 多选控件和时钟控件</title><summary type="text">本文发布的是我在工作中开发的自定义控件。第一个是多选控件，该控件主要启发来自于ExplorerBar，即资源管理器左侧的DirectDraw窗口，即打开文件夹时，位于左侧的那个可以扩展收缩的多面板组成的“文件夹任务”等。本控件的开发需求主要是用于在很多个Items中进行快速方便的选择和定位，因此我称它为多选控件。从外观上来看，它是由一些列面板从上到下的方式排列而成...</summary><published>2011-06-24T10:10:00Z</published><updated>2011-06-24T10:10:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/06/24/2089267.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/06/24/2089267.html"/><content type="html">&lt;p&gt;关键字：自定义控件（Custom Control)，C++，WIN32 SDK&lt;/p&gt;&#xD;
&lt;p&gt;本文发布的是我在工作中开发的自定义控件。第一个是多选控件，该控件主要启发来自于 ExplorerBar，即资源管理器左侧的 DirectDraw 部分，例如打开文件夹，位于左侧的那个可以扩展收缩的多面板组成的&amp;ldquo;文件夹任务&amp;rdquo;等。本控件的开发需求主要是用于在很多个Items中进行快速方便的选择和定位，因此我称它为多选控件。从外观上来看，它是由一些列面板从上到下的方式排列而成（我们把一个Group称为控件的一个Child，即第一层子结点的LineSize = 1），它和 Outlook 侧边栏的主要区别是，outlook侧栏是多个面板共享一个公用的较大客户区，即同一时刻通常仅可见一个面板（这一点类似TabControl），显然这个特征有时是我们需要的，但有时是我们不希望的。即 ExploerBar 和本控件则是多个面板同时可见的。比如说，TabPage上通常是按照功能分组归类到多个页面，这些页面彼此之间独立性较强，互相不依赖，因此在同一时刻只见到一个页面是比较符合用户意愿的。而我们要做的多选空间，他们都是本质上相同的，因此我希望随意组合式的多页面展示，这样可以给我们一个灵活又广阔的全局和局部视角组合，这种特点就是ExploreBar的特点。&lt;/p&gt;&#xD;
&lt;p&gt;因此总结下这个控件的诞生需求：是我们需要多选，多个面板保证灵活和快速定位的需求，即我们需要对Items进行一些分类并放入面板，可以任何折叠。使得提供灵活的视图。面板内部，由于Items的特征小而多，因此采用类似ListView的图标视图的做法，将他们从左到右进行布局。这样就可以比 TreeView 节省垂直方向的空间（因为Treeview每个节点都要占据一行），在这个控件里主要是各个元素之间都有边框，元素之间的间隔，边距等元素，这些元素显然会浪费一些空间。&lt;/p&gt;&#xD;
&lt;p&gt;本控件的组织架构是有顶层的代表窗口的一个类来管理的，下设Group集合。每个Group下面含有Items。每个Item为最基本单位，类似一个CheckBox。每个 Group 由Header和&amp;ldquo;客户区&amp;rdquo;组成。点击Header可以对其展开和折叠，同时左侧的按钮采用的是七帧图片得到旋转动画。截图如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011062417561838.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另一个控件是时钟控件，该控件模仿的是 windows mobile 系统上的闹钟设置控件。主要用于设置时刻（例如闹钟），里面内置两个属性，Hour 和 minute，没有日期。因此这是它和 DateTimePicker 的主要区别。用户可以用鼠标拖动分针和时针，进行时刻的设置。时钟控件由于主要时为用户设置时间而提供，因此绘制上追求的原则是高效和对时间清楚的示意性，而不在于界面的美观和华丽，因此它在外观上显得&amp;ldquo;朴素&amp;rdquo;。控件内默认的分针拖动单位是5分钟（也可以设置为最小的 1 分钟分辨率，则拖动时的运动会更加平稳），指针捕捉误差缓冲为 3 分钟左右。&lt;/p&gt;&#xD;
&lt;p&gt;此两个控件都采用了内存绘制技术用于防止闪烁。&lt;/p&gt;&#xD;
&lt;p&gt;由于开发的比较紧急，因此尤其多选控件还缺乏足够的测试，可能有些接口方法还需要进一步改进，一些接口也有待于增加。具体用法由于精力所限，我就不在这里用代码做示范了，可以参考 Demo 项目的代码。在发行文件夹里有一个MulSelCtl.h 头文件，模仿windows sdk的做法我已经定义了一些对应的宏。因为时间原因，我还没有写出具体的说明文档。&lt;/p&gt;&#xD;
&lt;p&gt;最后增加一些技术总结：&lt;/p&gt;&#xD;
&lt;p&gt;（1）读写文本文件时，应该尽量避免使用unicode版本的函数（fgetws等），因为读写中文时可能乱码。因此本控件中先把 unicode 转换到ansi 再和文件进行交互。&lt;/p&gt;&#xD;
&lt;p&gt;（2）写文本文件时，应该把&amp;ldquo;\r\n"转换成单个&amp;rdquo;\n&amp;ldquo;，否则写入文本文件时，由于底层函数自作主张的翻译，会把\r\n写成\r\r\n。在文本框文本和文件之间交换数据时，这一点尤其需要注意。&lt;/p&gt;&#xD;
&lt;p&gt;（3）自定义控件要写成DLL被其他进程加载和使用，则ClassStyle中需要添加CS_GLOBAL样式，否则其他进程无法创建其实例。&lt;/p&gt;&#xD;
&lt;p&gt;（4）自定义控件由于可能被创建出多个实例，因此其窗口过程不能使用 Static 变量持有和窗口实例相关的内部数据（状态）。这一点和我们写普通窗口（主窗口，模态对话框）过程时不同，因为它们通常时进程范围内唯一的，因此可以使用 Static 变量持有窗口数据，这一点尤其要注意。正确做法时在注册窗口类时，告知系统为每个窗口保留其窗口数据额外空间的大小，在 WM_NCCREATE 时分配和填写数据。&lt;/p&gt;&#xD;
&lt;p&gt;Demo项目和控件发行包（*.h, *.lib, *.dll）的下载连接如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/MulSelCtl.rar"&gt;http://files.cnblogs.com/hoodlum1980/MulSelCtl.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2089267.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/06/24/2089267.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/03/09/1978672.html</id><title type="text">修改WM手机铃声大小的小程序</title><summary type="text">我用的多普达S1手机，偶然发生手机的来电铃声忽然非常小的情况，在外面基本听不到电话。每次为了调整回来，都要baidu很久才能找到应该如何修改。为此，我就自己写了这个小程序，用于帮助我手工修改注册表的过程。这样我就不需要记住那个很难记住的注册表位置，设置起来也比用手机上的注册表编辑软件要方便的多。这个程序是用 VS2005 + WindowsMobile 6 SDK，C++语言开发的。它的本质非常简单，就是查询，修改注册表信息，因此这里就不贴代码了，使用C#也可以开发。</summary><published>2011-03-09T11:10:00Z</published><updated>2011-03-09T11:10:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/03/09/1978672.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/03/09/1978672.html"/><content type="html">&lt;p&gt;我用的多普达S1手机，偶然发生手机的来电铃声忽然非常小的情况，在外面基本听不到电话。每次为了调整回来，都要baidu很久才能找到应该如何修改。为此，我就自己写了这个小程序，用于帮助我手工修改注册表的过程。这样我就不需要记住那个很难记住的注册表位置，设置起来也比用手机上的注册表编辑软件要方便的多。这个程序是用 VS2005 + WindowsMobile 6 SDK，C++语言开发的。它的本质非常简单，就是查询，修改注册表信息，因此这里就不贴代码了，使用C#也可以开发。&lt;/p&gt;&#xD;
&lt;p&gt;程序截图如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011030919054756.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个小程序的下载连接：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/WMRingVol.rar"&gt;http://files.cnblogs.com/hoodlum1980/WMRingVol.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;【参考资料：】&lt;/p&gt;&#xD;
&lt;p&gt;（1）网页《WM6.1注册表修改详细介绍，一定有你需要的，有增大铃声音量的方法哦》：&lt;/p&gt;&#xD;
&lt;p&gt;【备注：】&lt;/p&gt;&#xD;
&lt;p&gt;（1）本程序修改的注册表位置主要位于以下位置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffff99;"&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="color: #ff0000;"&gt;HKEY_CURRENT_USER\\ControlPanel\\SoundCategories\\&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（2）我将其同时发布在PDAFANS论坛的地址是：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://bbs.pdafans.com/thread-1046881-1-1.html"&gt;http://bbs.pdafans.com/thread-1046881-1-1.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/1978672.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/03/09/1978672.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
