<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Rest Valley &#187; Coding</title> <atom:link href="http://lihdd.net/category/coding/feed/" rel="self" type="application/rss+xml" /><link>http://lihdd.net</link> <description>The scratchpad of quark</description> <lastBuildDate>Sat, 09 Oct 2010 13:56:19 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>去掉 Rainlendar Pro for Linux 的“未注册”字样</title><link>http://lihdd.net/remove-unregistered-from-rainlendar-pro/</link> <comments>http://lihdd.net/remove-unregistered-from-rainlendar-pro/#comments</comments> <pubDate>Sat, 09 Oct 2010 13:56:19 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[Hacking]]></category> <category><![CDATA[Library]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Rainlendar]]></category><guid
isPermaLink="false">http://lihdd.net/?p=457</guid> <description><![CDATA[很久没有更新 Blog 了。但这并不代表生活索然无味，最近的一段时间， MSRA 总算办夏令营了！于是有幸到在北京玩了六天，见到了许多新老朋友，有许多事情可以说。但如果篇幅有限，只能用一个字来总结这次夏令营，那只能是“热” 实现了 Linux 下的一个通用的 Sandbox，新版本 ZOJ 的后端应该就是它了。同时，发现了现有 ZOJ 几个非常严重的 Bug，真不知道在开源的情况下 ZOJ 是怎么活到现在的，现在想想还是冷汗直流啊 与学校免试研究生相关事情总算告于段落了，结果是和朋友们一起还要在学校呆至少两年多。可以向后来的学弟学妹们传达的信息是，如果不想被直博，那么就趁早准备出国吧&#8230; 做了一些简单的对各种 Web Sever 的性能测试，发现 Thin 表现出色，之前对用 ROR 性能的担忧就减少许多了。新版本的 ZOJ 的前端实现应该就是用它了 跟踪了东方永夜抄并实现了有一些功能的外挂，虽然即便这样，尝试了几次也只能让最高分的最高位达到 4 ，即将到 5，相比之下最高的未作弊记录是 6 &#8230; 用 LaTeX 和一段 Ruby 脚本自动实现集训队的代码模版的排版，相比之前手工用 Word 来排版，就不会出现少一个右括号而导致的悲剧情况了 这些事情有的是属于另外一个大一点的事情的一部分，完成度还没有到一定程度；有的是通过 Google around 再自己调一调就能完成的事情；有的是不适合公开的事情，所以就没有写 那么回到正题，Rainlendar 是一个很好的桌面日历软件，官方非常厚道，未注册的话只会在网络日历事件的工具提示中显示“[UNREGISTERED]”，没有使用时间限制和其他功能限制。而且，只要为 Rainlendar 的翻译做出一点贡献就能免费获得一份授权。 可惜目前中文版的翻译进度是 100%，而授权费用要 100 人名币多，翻一倍再凭借学生证就能买到 Windows 7 正版了，太贵了 那么来自己和谐掉这个“[UNREGISTERED]”吧。 显然，下面的途径都能达到目的： [...]]]></description> <content:encoded><![CDATA[<p>很久没有更新 Blog 了。但这并不代表生活索然无味，最近的一段时间，</p><ul><li>MSRA 总算办夏令营了！于是有幸到在北京玩了六天，见到了许多新老朋友，有许多事情可以说。但如果篇幅有限，只能用一个字来总结这次夏令营，那只能是“热” <img
src='http://lihdd.net/wp-includes/images/smilies/tongue.png' alt=':p' class='wp-smiley' /></li><li>实现了 Linux 下的一个通用的 Sandbox，新版本 <a
href="acm.zju.edu.cn">ZOJ</a> 的后端应该就是它了。同时，发现了现有 ZOJ 几个非常严重的 Bug，真不知道在开源的情况下 ZOJ 是怎么活到现在的，现在想想还是冷汗直流啊 <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /></li><li>与学校免试研究生相关事情总算告于段落了，结果是和朋友们一起还要在学校呆至少两年多。可以向后来的学弟学妹们传达的信息是，如果不想被直博，那么就趁早准备出国吧&#8230; <img
src='http://lihdd.net/wp-includes/images/smilies/what.png' alt='o.o' class='wp-smiley' /></li><li>做了一些简单的对各种 Web Sever 的性能测试，发现 <a
href="http://code.macournoyer.com/thin/">Thin</a> 表现出色，之前对用 <a
href="http://rubyonrails.org/">ROR</a> 性能的担忧就减少许多了。新版本的 ZOJ 的前端实现应该就是用它了 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></li><li>跟踪了<a
href="http://touhou-wiki.com/index.php?title=%E6%9D%B1%E6%96%B9%E6%B0%B8%E5%A4%9C%E6%8A%84">东方永夜抄</a>并实现了有一些功能的外挂，虽然即便这样，尝试了几次也只能让最高分的最高位达到 4 ，即将到 5，相比之下最高的未作弊记录是 6 &#8230; <img
src='http://lihdd.net/wp-includes/images/smilies/gaah.png' alt='O:' class='wp-smiley' /></li><li>用 LaTeX 和一段 Ruby 脚本自动实现集训队的代码模版的排版，相比之前手工用 Word 来排版，就不会出现少一个右括号而导致的悲剧情况了 <img
src='http://lihdd.net/wp-includes/images/smilies/meeh.png' alt='._.' class='wp-smiley' /></li></ul><p>这些事情有的是属于另外一个大一点的事情的一部分，完成度还没有到一定程度；有的是通过 Google around 再自己调一调就能完成的事情；有的是不适合公开的事情，所以就没有写 <img
src='http://lihdd.net/wp-includes/images/smilies/hmm.png' alt='.~.' class='wp-smiley' /></p><p>那么回到正题，Rainlendar 是一个很好的桌面日历软件，官方非常厚道，未注册的话只会在网络日历事件的工具提示中显示“[UNREGISTERED]”，没有使用时间限制和其他功能限制。而且，只要为 Rainlendar 的翻译做出一点贡献就能免费获得一份授权。<span
id="more-457"></span></p><p><img
src="http://lihdd.net/wp-content/uploads/2010/10/rainlendar_pro_unregistered_tooltip_1.png" alt="" title="rainlendar_pro_unregistered_tooltip_1" width="308" height="67" class="aligncenter size-full wp-image-460" /></p><p>可惜目前中文版的翻译进度是 100%，而授权费用要 100 人名币多，翻一倍再凭借学生证就能买到 Windows 7 正版了，太贵了 <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /> 那么来自己和谐掉这个“[UNREGISTERED]”吧。</p><p>显然，下面的途径都能达到目的：</p><ul><li>和谐掉授权检测部分的代码，让未授权始终通过；进一步地查明授权文件验证方式，算出授权文件</li><li>找出并和谐加入“[UNREGISTERED]”字样部分的代码</li><li>找到“[UNREGISTERED]”所在的数据段（如果存在），将这个字符串修改成空串</li><li>换掉和谐掉显示文字的函数，发现待显示字串中有“[UNREGISTERED]”字样就把他删除了再显示</li></ul><p>前两种途径难度都很大。那么祈祷一下 “[UNREGISTERED]” 是存在数据段或者是其他文件中的，不过显然作者不会这么弱的…… 于是就换掉显示文字的函数，用 file 命令发现 rainlendar 是动态链接的，那么这个成功的希望比较大。</p><p>Rainlendar 链接到了 libpango，那么几乎可以断定它是使用 <a
href="http://www.pango.org/">Pango</a> 绘制文字的，容易知道 Pango 绘制文字的函数是 <code>pango_layout_set_text_orig</code>，它的签名是</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> pango_layout_set_text <span style="color: #009900;">&#40;</span>PangoLayout <span style="color: #339933;">*</span>layout<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>text<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>到这里就很接近成功啦 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' />  由于 Linux 支持 <a
href="http://www.kernel.org/doc/man-pages/online/pages/man8/ld-linux.so.8.html">LD_PRELOAD</a>，那么换掉一个库函数很简单：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;dlfcn.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define UNREGISTERED &quot;[UNREGISTERED] &quot;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>libpango<span style="color: #339933;">;</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>pango_layout_set_text_orig<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
__attribute__<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>__constructor__<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #993333;">void</span> pango_hook_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	libpango <span style="color: #339933;">=</span> dlopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;libpango-1.0.so&quot;</span><span style="color: #339933;">,</span> RTLD_LOCAL  <span style="color: #339933;">|</span> RTLD_LAZY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	pango_layout_set_text_orig <span style="color: #339933;">=</span> dlsym<span style="color: #009900;">&#40;</span>libpango<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;pango_layout_set_text&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> pango_layout_set_text<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>layout<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>text<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> length<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> text <span style="color: #339933;">?</span> strstr<span style="color: #009900;">&#40;</span>text<span style="color: #339933;">,</span> UNREGISTERED<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>__builtin_expect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">long</span><span style="color: #009900;">&#41;</span>p<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #993333;">int</span> len <span style="color: #339933;">=</span> length <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">?</span> length <span style="color: #339933;">:</span> strlen<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		memmove<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> p <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>UNREGISTERED<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#40;</span>len <span style="color: #339933;">-=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>UNREGISTERED<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">-</span> text<span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>length <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> length <span style="color: #339933;">=</span> len<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	pango_layout_set_text_orig<span style="color: #009900;">&#40;</span>layout<span style="color: #339933;">,</span> text<span style="color: #339933;">,</span> length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>使用 <code>gcc $^ -fPIC -shared -o libpango_hook.so -ldl</code> 将上面的代码编译成动态链接库文件 libpango_hook.so，接着修改 /usr/bin/rainlendar，在运行 Rainlendar 之前，正确设置好 LD_PRELOAD，大概是这个样子：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/dash</span>
<span style="color: #007800;">RAINLENDAR_PATH</span>=<span style="color: #ff0000;">'/opt/rainlendar2'</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$RAINLENDAR_PATH</span>/libpango_hook.so&quot;</span>
<span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #007800;">$RAINLENDAR_PATH</span><span style="color: #000000; font-weight: bold;">/</span>rainlendar2</pre></div></div><p>接着祈祷一下 Rainlendar 不是通过 dlopen 再 dlsym 的方式定位 pango_layout_set_text 这个函数的，那么事实证明它确实不是这样的 <img
src='http://lihdd.net/wp-includes/images/smilies/very_happy.png' alt='^_^' class='wp-smiley' /></p><p><img
class="aligncenter size-full wp-image-461" title="rainlendar_pro_unregistered_tooltip_2" src="http://lihdd.net/wp-content/uploads/2010/10/rainlendar_pro_unregistered_tooltip_2.png" alt="" width="308" height="67" /></p><p>虽然中文字体不好看，但是“[UNREGISTERED]”不见了。</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/remove-unregistered-from-rainlendar-pro/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>一个 NFA 引发的血案</title><link>http://lihdd.net/one-nfa-related-homework-exercise/</link> <comments>http://lihdd.net/one-nfa-related-homework-exercise/#comments</comments> <pubDate>Thu, 11 Mar 2010 01:49:10 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[dfa]]></category> <category><![CDATA[nfa]]></category><guid
isPermaLink="false">http://lihdd.net/?p=331</guid> <description><![CDATA[引发血案的 NFA 就是下面这个，来自最近的《编译原理》作业的一道题： 把 NFA 变成 DFA 是有明确的办法的。只是，如果试着画一画上面这个图，就会发现另外一个问题，到底要画多少条线，几个圈，会不会把自己绕糊涂呢 于是我就想去找一个程序，可以自动完成这种枯燥的 NFA 到 DFA 的转换工作 。在 pluskid 的这篇日志里面看到了 reAnimator 这个在线工具，它可以把一串正则表达式的NFA和最简的DFA画出来。不过只能处理简单的情况，像上面那样 (a&#124;b)*a(a&#124;b)(a&#124;b)(a&#124;b)(a&#124;b) 的表达式根本没法画出图来 reAnimator 作者的博客上面介绍了它的实现，但具体细节并没有公开，只好再去找其他的工具…… 直觉说 Mathematica 很可能提供了相关的功能。很遗憾找了半天没找到内建的和 FA 有关的函数，惊喜的是在网上有一个叫做 Finite Automata 的 Mathematica 包，看起来功能全面，挺不错。但是用一下就发现它的实现（比如，NFA 到 DFA 的转换）是有错误的，果断放弃 再找到的就是一个叫做 Visual Automata Simulator 的软件，提供了 NFA 到 DFA 转换的功能，看起来很不错。用它完成了转换工作，血案由此产生了：一共画出来了 32 个状态和 64 条边…… 经过简单的测试， VAS 软件并不会做最小化 DFA 的工作，那么上面的结果可不可以再简单一点呢？比如下面的这个 DFA： 可以被最小化到： [...]]]></description> <content:encoded><![CDATA[<p>引发血案的 NFA 就是下面这个，来自最近的《编译原理》作业的一道题：</p><div
id="attachment_306" class="wp-caption aligncenter" style="width: 528px"><img
class="size-full wp-image-306  " title="ex_nfa2dfa" src="http://lihdd.net/wp-content/uploads/2010/03/ex_nfa2dfa.png" alt="ex_nfa2dfa" width="518" height="97" /><p
class="wp-caption-text">将这个 NFA 转化成 DFA</p></div><p>把 NFA 变成 DFA 是有明确的办法的。只是，如果试着画一画上面这个图，就会发现另外一个问题，到底要画多少条线，几个圈，会不会把自己绕糊涂呢 <img
src='http://lihdd.net/wp-includes/images/smilies/hmm.png' alt='.~.' class='wp-smiley' /><br
/> <span
id="more-331"></span><br
/> 于是我就想去找一个程序，可以自动完成这种枯燥的 NFA 到 DFA 的转换工作 。在 <a
href="http://blog.pluskid.org/?p=285">pluskid 的这篇日志</a>里面看到了 <a
href="http://osteele.com/tools/reanimator/">reAnimator</a> 这个在线工具，它可以把一串正则表达式的NFA和最简的DFA画出来。不过只能处理简单的情况，像上面那样</p><pre>(a|b)*a(a|b)(a|b)(a|b)(a|b)</pre><p>的表达式根本没法画出图来 <img
src='http://lihdd.net/wp-includes/images/smilies/what.png' alt='o.o' class='wp-smiley' /> reAnimator 作者的博客上面介绍了它的实现，但具体细节并没有公开，只好再去找其他的工具……</p><p>直觉说 <em>Mathematica</em> 很可能提供了相关的功能。很遗憾找了半天没找到内建的和 FA 有关的函数，惊喜的是在网上有一个叫做 <a
href="http://library.wolfram.com/infocenter/Demos/75/">Finite Automata</a> 的 <em>Mathematica</em> 包，看起来功能全面，挺不错。但是用一下就发现它的实现（比如，NFA 到 DFA 的转换）是有错误的，果断放弃 <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /></p><p>再找到的就是一个叫做 <a
href="http://www.cs.usfca.edu/~jbovet/vas.html">Visual Automata Simulator</a> 的软件，提供了 NFA 到 DFA 转换的功能，看起来很不错。用它完成了转换工作，血案由此产生了：一共画出来了 32 个状态和 64 条边……</p><p>经过简单的测试， VAS 软件并不会做最小化 DFA 的工作，那么上面的结果可不可以再简单一点呢？比如下面的这个 DFA：</p><p
style="text-align: center;"><img
class="aligncenter size-full wp-image-318" title="dfa_normal" src="http://lihdd.net/wp-content/uploads/2010/03/dfa_normal.png" alt="dfa_normal" width="330" height="239" /></p><p>可以被最小化到：</p><p
style="text-align: center;"><img
class="aligncenter size-full wp-image-319" title="dfa_minimized" src="http://lihdd.net/wp-content/uploads/2010/03/dfa_minimized.png" alt="dfa_minimized" width="286" height="240" /></p><p
style="text-align: left;">试试看？我在 VAS 的代码上加了课本上介绍的最小化 DFA 的方法，结果对刚才的 64 条边的图毫无效果 <img
src='http://lihdd.net/wp-includes/images/smilies/meeh.png' alt='._.' class='wp-smiley' /></p><p
style="text-align: left;">那么就把这个图打印出来吧，都到这一步了，写一个“略”在作业本上不太好吧。不过，VAS 自己没有自动排版功能，线条和圆圈画得非常乱。在 VAS 中不难实现一个导出 dot 文件的功能，然后就可以用 <a
href="http://www.graphviz.org/">graphviz</a> 来排版了 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><p>最后排出来大概是<a
href="http://lihdd.net/wp-content/uploads/2010/03/dfa_by_dot.svg">这个样子</a>，还是挺乱的样子，也许自动排版成这个样子算是很好了吧。</p><p>我觉得 VAS 这个工具还是挺好的，在官方 1.2.2 版本上我添加了 DFA 最小化和导出到 dot 文件两个功能，擅自把版本号改成了 1.2.3。放在这里，也许什么时候会被用一下：</p><p><a
href="http://lihdd.net/wp-content/uploads/2010/03/vas.jar">Visual Automata Simulator 1.2.3 (jar)</a> <a
href="http://lihdd.net/wp-content/uploads/2010/03/vas_src.zip">(源代码)</a></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/one-nfa-related-homework-exercise/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>云中的搜狗,云下的输入法</title><link>http://lihdd.net/sogou-cloud-on-ibus/</link> <comments>http://lihdd.net/sogou-cloud-on-ibus/#comments</comments> <pubDate>Thu, 05 Nov 2009 05:25:29 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[ibus-sogoupycc]]></category> <category><![CDATA[ime]]></category> <category><![CDATA[sogou]]></category><guid
isPermaLink="false">http://lihdd.net/?p=277</guid> <description><![CDATA[前不久，搜狗官方公布了云输入法，简单的说就是把所有的拼音转换成汉字的工作都交给搜狗服务器来做，按照搜狗官方的说法，服务器的词库和速度都是个人计算机不能比的，当然效果会很不错，错字会比较少。实际使用感觉也十分好，让我想到了第一次用微软拼音输入法的时候，那种能够整句输入并且结果不错的兴奋的感觉 :-) 官方给出的云输入法是基于web页面的，只能在浏览器中使用，目前只支持全拼，在浏览器中一旦转移到其它页面，就需要重新加载一次输入法，用起来成本很高。检查后发现官方的云输入法客户端其实就是向服务器发送了明文的全拼字符串，然后服务器会返回一段js脚本，包含了候选结果，往往第一个结果就是所需的，确实识别结果不错。Linux下的各种拼音输入法都没有Windows平台下的好用，既然搜狗云输入法是这样简单的AJAX请求，那么能不能包装一下它，让它在其他的地方也能用呢? 之前对ibus的示例代码有印象，觉得在ibus上面开发输入法比较简单，而且ibus这个平台看起来很可靠的样子，于是就开始动手了，这次从一开始就决定用C来写，写到中间的时候发现真的是自找麻烦 :-( ，许多数据结构如果用C++的话就容易多了，也免去了考虑内存泄漏等各种问题。 我用输入法的话，肯定是用双拼的了，于是就先去找双拼的代码，关于双拼，其实我以前已经写过几份了，在目前的本本上能找到的版本就是有一次修改sun-pinyin让它支持双拼的时候，那时的代码是为了达到目的而不择手段的，使用if else硬编码了所有的双拼组合，不仅看起来惨不忍睹，时间复杂度想来也不好。这次改用C语言的OO写法写了双拼的一个类，使用动态构造的简单的trie大幅提高查询速度。这里还用了char **[]这样的数据类型，写完后用pluskid上次在小课堂上介绍的valgrind检查内存发现没有泄漏，比较高兴 :-) 但是并不是所有地方都是这样顺利的，输入法的最麻烦的地方是对用户按键事件的处理，确实有很多很多情况，稍不注意就会出问题，确实在这个地方调试了不少时间，而且在这里改代码，改正一个问题的时候很容易产生新的问题 。为了让用户在服务器没有返回结果的时候还能继续输入，我使用了多线程去从服务器获取结果，为了数据完整，我在所有写操作的地方都简单地使用了锁，第一次写这样的多线程程序，死锁了几次，后来熟悉起来就没有再犯错误 :-) 当我写的差不多的时候，升级到了ibus 1.2版本，这个版本和我开发使用的1.1版本接口不一样，似乎改动的地方文档不全的样子，我只好又改成了1.2版本使用的代码，不过由此也产生了各种问题，可能到现在都还存在。 虽然自己发现目前的程序还会在某些时候不知道为什么而垮掉，而且似乎还有各种已知和未知的小问题 但我觉得基本功能已经不错，可以拿出去分享一下了，就放在了这里，也许能够交几个朋友或者是收到比较不错的建议呢 目前的情况在上面的项目主页有介绍，程序的主要特点就是多线程，用户输入无阻塞，以及支持双拼（到底有多少人用双拼啊，可怜的孤独的我&#8230; -.- ），没有选词功能，始终采用服务器返回的第一个结果，这样其实在鼓励用户不要去选词，少按空格确认输入的拼音，因为标点符号就附带有这样的效果(和微软拼音一样)，用户可以流畅而义无反顾地输入整句的拼音，不因为实际出现的汉字而打扰思考 :-) 如果网络流畅的话，实际体验是很不错的： 在网络条件不好的地方，应该也是不错的吧，我模拟的网络延迟比较大的情况，大概会是这样的情况： 如果搜狗官方可以持续做这个项目并且不把接口改得没法看懂的话，这个项目还可以继续做下去，继续做的话有两个功能可以加上:第一个是输入一个字的话就不经由服务器了，这时候给出本地的符合要求的所有汉字列表，这样可以解决生僻字输入问题，也对个别汉字纠错提供方便。第二个是缓存一些比较短的词语，再次输入的时候可以使用缓存的数据(不过用云输入的话基本都是整句输入，不会缓存到许多数据的吧 ) 这篇日志的前面500字就是用ibus-sogoupycc在无线网上写的，除了个别时候出现网络错误之外，确实是几乎没有错字(5个左右吧)，后面由于网络条件太差改用普通的拼音输入法了，明显感觉到正确识别率低了许多许多 总之,现在的情况还是多谢搜狗官方啊,希望这项服越做越好,可以一直用下去 ]]></description> <content:encoded><![CDATA[<p><a
href="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc.png"><img
class="alignright size-full wp-image-278" title="ibus-sogoupycc" src="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc.png" alt="ibus-sogoupycc" width="48" height="48" /></a>前不久，搜狗官方公布了<a
title="搜狗云输入法" href="http://pinyin。sogou。com/cloud/" target="_blank">云输入法</a>，简单的说就是把所有的拼音转换成汉字的工作都交给搜狗服务器来做，按照搜狗官方的说法，服务器的词库和速度都是个人计算机不能比的，当然效果会很不错，错字会比较少。实际使用感觉也十分好，让我想到了第一次用微软拼音输入法的时候，那种能够整句输入并且结果不错的兴奋的感觉  :-)</p><p>官方给出的云输入法是基于web页面的，只能在浏览器中使用，目前只支持全拼，在浏览器中一旦转移到其它页面，就需要重新加载一次输入法，用起来成本很高。检查后发现官方的云输入法客户端其实就是向服务器发送了明文的全拼字符串，然后服务器会返回一段js脚本，包含了候选结果，往往第一个结果就是所需的，确实识别结果不错。Linux下的各种拼音输入法都没有Windows平台下的好用，既然搜狗云输入法是这样简单的AJAX请求，那么能不能包装一下它，让它在其他的地方也能用呢? <img
src='http://lihdd.net/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' /> <span
id="more-277"></span></p><p>之前对<a
title="ibus project home" href="http://code.google.com/p/ibus/" target="_blank">ibus</a>的示例代码有印象，觉得在ibus上面开发输入法比较简单，而且ibus这个平台看起来很可靠的样子，于是就开始动手了，这次从一开始就决定用C来写，写到中间的时候发现真的是自找麻烦  :-( ，许多数据结构如果用C++的话就容易多了，也免去了考虑内存泄漏等各种问题。</p><p>我用输入法的话，肯定是用双拼的了，于是就先去找双拼的代码，关于双拼，其实我以前已经写过几份了，在目前的本本上能找到的版本就是有一次修改sun-pinyin让它支持双拼的时候，那时的代码是为了达到目的而不择手段的，使用if else硬编码了所有的双拼组合，不仅看起来惨不忍睹，时间复杂度想来也不好。这次改用C语言的OO写法写了双拼的一个类，使用动态构造的简单的trie大幅提高查询速度。这里还用了<code>char **[]</code>这样的数据类型，写完后用<a
title="Free Mind of pluskid" href="http://blog.pluskid.org/" target="_blank">pluskid</a>上次在<a
title="MSTC 小课堂之 C 语言调试技术" href="http://blog.pluskid.org/?p=403" target="_blank">小课堂</a>上介绍的valgrind检查内存发现没有泄漏，比较高兴  :-)</p><p>但是并不是所有地方都是这样顺利的，输入法的最麻烦的地方是对用户按键事件的处理，确实有很多很多情况，稍不注意就会出问题，确实在这个地方调试了不少时间，而且在这里改代码，改正一个问题的时候很容易产生新的问题 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' /> 。为了让用户在服务器没有返回结果的时候还能继续输入，我使用了多线程去从服务器获取结果，为了数据完整，我在所有写操作的地方都简单地使用了锁，第一次写这样的多线程程序，死锁了几次，后来熟悉起来就没有再犯错误 :-) 当我写的差不多的时候，升级到了ibus 1.2版本，这个版本和我开发使用的1.1版本接口不一样，似乎改动的地方文档不全的样子，我只好又改成了1.2版本使用的代码，不过由此也产生了各种问题，可能到现在都还存在。</p><p>虽然自己发现目前的程序还会在某些时候不知道为什么而垮掉，而且似乎还有各种已知和未知的小问题 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_redface.gif' alt=':oops:' class='wp-smiley' /> 但我觉得基本功能已经不错，可以拿出去分享一下了，就放在了<a
title="ibus-sogoupycc" href="http://code.google.com/p/ibus-sogoupycc/">这里</a>，也许能够交几个朋友或者是收到比较不错的建议呢 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p><p>目前的情况在上面的项目主页有介绍，程序的主要特点就是多线程，用户输入无阻塞，以及支持双拼（到底有多少人用双拼啊，可怜的孤独的我&#8230; -.- ），没有选词功能，始终采用服务器返回的第一个结果，这样其实在鼓励用户不要去选词，少按空格确认输入的拼音，因为标点符号就附带有这样的效果(和微软拼音一样)，用户可以流畅而义无反顾地输入整句的拼音，不因为实际出现的汉字而打扰思考 :-) 如果网络流畅的话，实际体验是很不错的：</p><div
id="attachment_280" class="wp-caption aligncenter" style="width: 268px"><a
href="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc-demo.gif"><img
class="size-full wp-image-280" title="ibus-sogoupycc-demo" src="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc-demo.gif" alt="网络比较流畅的情况下输入法的表现" width="258" height="33" /></a><p
class="wp-caption-text">网络比较流畅的情况</p></div><p>在网络条件不好的地方，应该也是不错的吧，我模拟的网络延迟比较大的情况，大概会是这样的情况：</p><div
id="attachment_279" class="wp-caption aligncenter" style="width: 310px"><a
href="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc-slow-network-demo.gif"><img
class="size-full wp-image-279" title="ibus-sogoupycc-slow-network-demo" src="http://lihdd.net/wp-content/uploads/2009/11/ibus-sogoupycc-slow-network-demo.gif" alt="网络延迟明显的情况下输入法的表现" width="300" height="102" /></a><p
class="wp-caption-text">网络延迟明显(模拟)的情况</p></div><p>如果搜狗官方可以持续做这个项目并且不把接口改得没法看懂的话，这个项目还可以继续做下去，继续做的话有两个功能可以加上:第一个是输入一个字的话就不经由服务器了，这时候给出本地的符合要求的所有汉字列表，这样可以解决生僻字输入问题，也对个别汉字纠错提供方便。第二个是缓存一些比较短的词语，再次输入的时候可以使用缓存的数据(不过用云输入的话基本都是整句输入，不会缓存到许多数据的吧 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /> )</p><p>这篇日志的前面500字就是用ibus-sogoupycc在无线网上写的，除了个别时候出现网络错误之外，确实是几乎没有错字(5个左右吧)，后面由于网络条件太差改用普通的拼音输入法了，明显感觉到正确识别率低了许多许多 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /></p><p>总之,现在的情况还是多谢搜狗官方啊,希望这项服越做越好,可以一直用下去  <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/sogou-cloud-on-ibus/feed/</wfw:commentRss> <slash:comments>17</slash:comments> </item> <item><title>爱浮云</title><link>http://lihdd.net/eye-candy-lyrics/</link> <comments>http://lihdd.net/eye-candy-lyrics/#comments</comments> <pubDate>Mon, 02 Nov 2009 14:25:25 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[Life]]></category> <category><![CDATA[MPD]]></category><guid
isPermaLink="false">http://lihdd.net/?p=271</guid> <description><![CDATA[“浮云”被用来指花哨而没有实际用处的东西，在计算机日常使用中，我想大多数人是希望自己看到屏幕上的内容能够漂亮一些，是喜欢“浮云”的。不过也有一些人希望计算机反应更快，有更多可用内存，界面简洁朴素，够用就好。虽然我曾经也是后者队伍的一员，但现在计算机这样快，要对自己好一点 昨天总算把yy许久的自己的桌面歌词在Linux下实现得可以自己用了。 这里有一小段演示视频（1.23MB)，由于录制帧速不是很好，实际看起来的动画要比视频中的连贯和清楚一些。如果视频比较麻烦，下面是拼成的图片动画演示，实际文字中心在我屏幕的位置是下方靠近任务栏，横向上的0.618处： 这个想法其实是受到foo_osd插件的启发，比Windows下各种播放器的“桌面歌词“出现得要早许多，没想到直到现在才做出了一个成型的版本。 目前的实现是比较快完成的，基本是想到什么问题解决什么问题，事先没有仔细想应该如何规划。现在是由三部分组成，觉得还不错： C语言实现的osdshow，从标准输入读入一系列的“关键帧”（包括文字，字体颜色、大小、边框颜色、粗细、阴影颜色、位置、横向和纵向模糊程度以及全局透明度等）和它们之间的过渡时间和速度，在屏幕上画出来。这个程序使用了一定的措施在保持较好的灵活性的情况下，尽量保证了绘图的效率和用户看起来的连贯性。 shell脚本简单实现的osdprint.sh，只接受文字和可选的时间参数，负责创建4个关键帧，调用上面的程序，在屏幕固定位置创建固定样式的动画。 lua脚本mpclyosd.lua，负责从MPD获得当前播放的文件和时间，解析lrc文件，每有新的一句歌词要显示的时候就会调用上面的shell脚本去显示歌词。 不知道有多少人会需要以及喜欢这样一个东西？ 有意见或者想法的同学在这里留个言吧，或者通过Contact页联系我～ 目前还想做一些周边的事情，但是快要考试了，估计要pending一阵子： 找一个自动搜索、下载歌词的办法 看看能不能支持Linux下其他一些主流音乐播放器。 我现在想是如果做得差不多的话，就公开这个项目试试看。这其实又会有一些其他的麻烦，比如我用到了各种语言来实现，其中lua需要luarocks(类似ruby的gem的专用包管理器)安装的luasocket，这样的依赖怎样在各种发行版的包管理器中体现出来，并且得到正确处理？我是不是应该把这些组件分开来？还有是放在本站上，还是放在其他的地方呢等等。 总之，期待吧 :-)]]></description> <content:encoded><![CDATA[<p>“浮云”被用来指花哨而没有实际用处的东西，在计算机日常使用中，我想大多数人是希望自己看到屏幕上的内容能够漂亮一些，是喜欢“浮云”的。不过也有一些人希望计算机反应更快，有更多可用内存，界面简洁朴素，够用就好。虽然我曾经也是后者队伍的一员，但现在计算机这样快，要对自己好一点 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /></p><p>昨天总算把yy许久的自己的桌面歌词在Linux下实现得可以自己用了。</p><p>这里有一小段<a
href="http://lihdd.net/wp-content/uploads/2009/11/mpdlyricsosd-trail.mpeg">演示视频</a>（1.23MB)，由于录制帧速不是很好，实际看起来的动画要比视频中的连贯和清楚一些。如果视频比较麻烦，下面是拼成的图片动画演示，实际文字中心在我屏幕的位置是下方靠近任务栏，横向上的0.618处：</p><div
id="attachment_274" class="wp-caption aligncenter" style="width: 574px"><a
href="http://lihdd.net/wp-content/uploads/2009/11/mpclyricsosd_sample.gif"><img
class="size-full wp-image-274" title="mpclyricsosd_sample" src="http://lihdd.net/wp-content/uploads/2009/11/mpclyricsosd_sample.gif" alt="简要动画演示" width="564" height="79" /></a><p
class="wp-caption-text">简要动画演示</p></div><p><span
id="more-271"></span>这个想法其实是受到<a
title="foo_osd插件主页" href="http://kode54.foobar2000.org/" target="_blank">foo_osd</a>插件的启发，比Windows下各种播放器的“桌面歌词“出现得要早许多，没想到直到现在才做出了一个成型的版本。</p><p>目前的实现是比较快完成的，基本是想到什么问题解决什么问题，事先没有仔细想应该如何规划。现在是由三部分组成，觉得还不错：</p><ol><li>C语言实现的osdshow，从标准输入读入一系列的“关键帧”（包括文字，字体颜色、大小、边框颜色、粗细、阴影颜色、位置、横向和纵向模糊程度以及全局透明度等）和它们之间的过渡时间和速度，在屏幕上画出来。这个程序使用了一定的措施在保持较好的灵活性的情况下，尽量保证了绘图的效率和用户看起来的连贯性。</li><li>shell脚本简单实现的osdprint.sh，只接受文字和可选的时间参数，负责创建4个关键帧，调用上面的程序，在屏幕固定位置创建固定样式的动画。</li><li>lua脚本mpclyosd.lua，负责从<a
title="Music Player Daemon Community Wiki" href="http://mpd.wikia.com/" target="_blank">MPD</a>获得当前播放的文件和时间，解析lrc文件，每有新的一句歌词要显示的时候就会调用上面的shell脚本去显示歌词。</li></ol><p>不知道有多少人会需要以及喜欢这样一个东西？ <img
src='http://lihdd.net/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' /> 有意见或者想法的同学在这里留个言吧，或者通过<a
href="http://lihdd.net/?page_id=7">Contact页</a>联系我～</p><p>目前还想做一些周边的事情，但是快要考试了，估计要pending一阵子：</p><ul><li>找一个自动搜索、下载歌词的办法</li><li>看看能不能支持Linux下其他一些主流音乐播放器。</li></ul><p>我现在想是如果做得差不多的话，就公开这个项目试试看。这其实又会有一些其他的麻烦，比如我用到了各种语言来实现，其中lua需要luarocks(类似ruby的gem的专用包管理器)安装的luasocket，这样的依赖怎样在各种发行版的包管理器中体现出来，并且得到正确处理？我是不是应该把这些组件分开来？还有是放在本站上，还是放在其他的地方呢等等。</p><p>总之，期待吧  :-)</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/eye-candy-lyrics/feed/</wfw:commentRss> <slash:comments>11</slash:comments> <enclosure
url="http://lihdd.net/wp-content/uploads/2009/11/mpdlyricsosd-trail.mpeg" length="1239214" type="video/mpeg" /> </item> <item><title>Limited Memory</title><link>http://lihdd.net/limited-memory/</link> <comments>http://lihdd.net/limited-memory/#comments</comments> <pubDate>Wed, 28 Oct 2009 07:04:23 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[archlinux]]></category> <category><![CDATA[c]]></category> <category><![CDATA[memory]]></category><guid
isPermaLink="false">http://lihdd.net/?p=235</guid> <description><![CDATA[今天在虚拟机里面用Word处理文档的时候，突然硬盘灯一阵狂闪，然后虚拟机就一起消失了。 这种事情屡见不鲜，很明显是Linux内核把占用最多内存的程序（这次是VirtualBox）终止掉了，而硬盘灯为什么会狂闪呢？这是因为在内存用光之前，Linux的pdflush会把dirty pages写回磁盘上腾出内存给其他程序用。这段时间系统几乎处于不可用状态，Annoying! oom_killer 默认配置下，当没有内存可以用而又要用到内存时，Linux内核的oom_killer（out of memory killer）会扫描一遍占用内存最多的程序（可能有多个，比如VirtualBox和Firefox一起悲剧），并把它们结束掉。 这种扫描其实代价还是挺大的，可以选择让oom_killer不要扫描出用内存最多的进程，只是解决掉申请内存的那些进程： sysctl -w vm.oom_kill_allocating_task = 1 使用这样的设置，oom_killer不会去花时间寻找占内存最多的进程杀掉，VirtualBox和Firefox就有一定机会幸免。但是在内存用完的那一瞬间，谁去申请或者使用一片空白的内存，谁就会悲剧，而且可能是几个进程一起被杀掉，充满了不可预测性（比如，Xorg被杀掉，于是许多程序连带就挂掉了，再比如后台的mysqld被杀掉也会带来许多不方便），而且也没有避免pdflush在最后关头让硬盘灯狂闪的情况。 总之，oom_killer很不和谐，最好不要让它出场。在这一点上，openSolaris似乎做的就比较好，从外表上看，在内存不够的时候，系统不会去主动杀掉正在运行的程序，而是拒绝运行新的程序，并且运行中的程序如果申请内存的话就会被暂停，直至有内存可以给它的时候才继续运行。 overcommit 那么系统为什么不能提前检测到内存用完呢，malloc是有可能返回NULL的啊？现在的操作系统中，允许过分地申请内存，如果只是申请内存而没有实际使用的话，可以申请到比实际内存大许多的空间（比如用malloc申请内存，while(1) malloc(x);这样的程序都可以运行好长时间），只有一旦开始用（比如用memset去填），才会计入真正的内存使用，这时候如果内存真的不够了，那么oom_killer就上场了。 目前的Linux提供了一些选项用来调整这种内存策略 :-) 默认情况下，vm.overcommit_memory = 0，这时候可以申请到比较多的内存，但是仍然会在一定的时候申请失败。 还有更宽松一些的，如果 vm.overcommit_memory = 1，所有的malloc都会无条件成功 相当可怕的世界。 最后一种选择就是这个了： sysctl -w vm.overcommit_memory = 2 这时候，对申请内存总数有严格的限制，malloc会在超过限制的时候返回NULL，应用程序可以适当处理这种情况，而oom_killer再也不会蹦出来了，pdflush也不会让硬盘转得系统没响应，如果一个程序不能适当处理这种情况，就立即挂掉，干净利落。 但是这也有坏处，这时候参数vm.overcommit_ratio也会起作用，默认是50，意思是只能分配到实际物理内存的50%。如果没有交换区的话，overcommit_ratio设置得小就会很悲剧，几乎什么都做不了。 那把它设置成100，事情就非常和谐了？没有这样简单，这里的限制是申请内存总数的限制，如果申请了却没有实际用到的话，也是计入总数的。这样的话，实际内存没有用完，程序也很有可能申请不到内存，有一些内存就被浪费了。 虽然overcommit_ratio可以被设置成大于100的数，但是到底设置成多少确是个棘手的问题，设置大了，就和没有限制一样，内存用完时硬盘会狂转，系统会失去响应一段时间，oom_killer有可能会上场，设置小了，有可能几百兆的内存被白白浪费了 检查内存信息可以看到： % cat /proc/meminfo MemTotal: 2064616 kB MemFree: 1556672 kB .... CommitLimit: 2064616 kB Committed_AS: 769068 [...]]]></description> <content:encoded><![CDATA[<p>今天在虚拟机里面用Word处理文档的时候，突然硬盘灯一阵狂闪，然后虚拟机就一起消失了。</p><p>这种事情屡见不鲜，很明显是Linux内核把占用最多内存的程序（这次是VirtualBox）终止掉了，而硬盘灯为什么会狂闪呢？这是因为在内存用光之前，Linux的pdflush会把dirty pages写回磁盘上腾出内存给其他程序用。这段时间系统几乎处于不可用状态，Annoying! <img
src='http://lihdd.net/wp-includes/images/smilies/icon_evil.gif' alt=':evil:' class='wp-smiley' /> <span
id="more-235"></span></p><h3>oom_killer</h3><p>默认配置下，当没有内存可以用而又要用到内存时，Linux内核的oom_killer（out of memory killer）会扫描一遍占用内存最多的程序（可能有多个，比如VirtualBox和Firefox一起悲剧），并把它们结束掉。</p><p>这种扫描其实代价还是挺大的，可以选择让oom_killer不要扫描出用内存最多的进程，只是解决掉申请内存的那些进程：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">sysctl <span style="color: #660033;">-w</span> vm.oom_kill_allocating_task = <span style="color: #000000;">1</span></pre></div></div><p>使用这样的设置，oom_killer不会去花时间寻找占内存最多的进程杀掉，VirtualBox和Firefox就有一定机会幸免。但是在内存用完的那一瞬间，谁去申请或者使用一片空白的内存，谁就会悲剧，而且可能是几个进程一起被杀掉，充满了不可预测性（比如，Xorg被杀掉，于是许多程序连带就挂掉了，再比如后台的mysqld被杀掉也会带来许多不方便），而且也没有避免pdflush在最后关头让硬盘灯狂闪的情况。</p><p>总之，oom_killer很不和谐，最好不要让它出场。在这一点上，openSolaris似乎做的就比较好，从外表上看，在内存不够的时候，系统不会去主动杀掉正在运行的程序，而是拒绝运行新的程序，并且运行中的程序如果申请内存的话就会被暂停，直至有内存可以给它的时候才继续运行。</p><h3>overcommit</h3><p>那么系统为什么不能提前检测到内存用完呢，malloc是有可能返回NULL的啊？现在的操作系统中，允许过分地申请内存，如果只是申请内存而没有实际使用的话，可以申请到比实际内存大许多的空间（比如用malloc申请内存，<code>while(1) malloc(x);</code>这样的程序都可以运行好长时间），只有一旦开始用（比如用memset去填），才会计入真正的内存使用，这时候如果内存真的不够了，那么oom_killer就上场了。</p><p>目前的Linux提供了一些选项用来调整这种内存策略 :-)</p><p>默认情况下，<code>vm.overcommit_memory = 0</code>，这时候可以申请到比较多的内存，但是仍然会在一定的时候申请失败。</p><p>还有更宽松一些的，如果 <code>vm.overcommit_memory = 1</code>，所有的malloc都会无条件成功 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /> 相当可怕的世界。</p><p>最后一种选择就是这个了：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">sysctl <span style="color: #660033;">-w</span> vm.overcommit_memory = <span style="color: #000000;">2</span></pre></div></div><p>这时候，对申请内存总数有严格的限制，malloc会在超过限制的时候返回NULL，应用程序可以适当处理这种情况，而oom_killer再也不会蹦出来了，pdflush也不会让硬盘转得系统没响应，如果一个程序不能适当处理这种情况，就立即挂掉，干净利落。</p><p>但是这也有坏处，这时候参数<code>vm.overcommit_ratio</code>也会起作用，默认是50，意思是只能分配到实际物理内存的50%。如果没有交换区的话，<code>overcommit_ratio</code>设置得小就会很悲剧，几乎什么都做不了。</p><p>那把它设置成100，事情就非常和谐了？没有这样简单，这里的限制是申请内存总数的限制，如果申请了却没有实际用到的话，也是计入总数的。这样的话，实际内存没有用完，程序也很有可能申请不到内存，有一些内存就被浪费了。</p><p>虽然<code>overcommit_ratio</code>可以被设置成大于100的数，但是到底设置成多少确是个棘手的问题，设置大了，就和没有限制一样，内存用完时硬盘会狂转，系统会失去响应一段时间，oom_killer有可能会上场，设置小了，有可能几百兆的内存被白白浪费了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /></p><hr
style="border: 1px solid #cccccc; height: 1px; width: 85%; color: #ffffff;" size="1" noshade="noshade" /><p>检查内存信息可以看到：</p><pre>% cat /proc/meminfo
MemTotal:        2064616 kB
MemFree:         1556672 kB
....
CommitLimit:     2064616 kB
Committed_AS:     769068 kB
....</pre><p>其中Committed_AS是程序申请的内存总和，不能超过CommitLimit。很明显地看到Committed_AS+MemFree比MemTotal大，看起来把CommitLimit设置成Committed_AS+MemFree比较合适。</p><p>不过这个时候，CommitLimit是只受<code>overcommit_ratio</code>影响的，内存使用状态在动态变化，只好写一个程序来动态修改<code>overcommit_ratio</code>了。</p><p>最后我写了这样的一段C的小程序，每一秒设置一次<code>overcommit_ratio</code>。在目前版本的Linux内核(2.6.31)上i686平台可用：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define _GNU_SOURCE 1</span>
&nbsp;
<span style="color: #339933;">#include &lt;unistd .h&gt;</span>
<span style="color: #339933;">#include &lt;stdio .h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib .h&gt;</span>
<span style="color: #339933;">#include &lt;err .h&gt;</span>
<span style="color: #339933;">#include &lt;errno .h&gt;</span>
<span style="color: #339933;">#include &lt;string .h&gt;</span>
&nbsp;
<span style="color: #339933;">#define errexit(status, info) fprintf(stderr, &quot;%s: %s\n&quot;, program_invocation_name, info), exit(status);</span>
&nbsp;
FILE <span style="color: #339933;">*</span>fp_meminfo<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> set_overcommitted_limit<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> new_value<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> old_len <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	FILE <span style="color: #339933;">*</span>fp_overcommit_ratio<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>fp_overcommit_ratio <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/proc/sys/vm/overcommit_ratio&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		err<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">4</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;can't write /proc/sys/vm/overcommit_ratio&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fprintf<span style="color: #009900;">&#40;</span>fp_overcommit_ratio<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	fclose<span style="color: #009900;">&#40;</span>fp_overcommit_ratio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #993333;">const</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> item_name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> item_value<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">int</span> mem_free<span style="color: #339933;">,</span> mem_total<span style="color: #339933;">,</span> committed_as<span style="color: #339933;">,</span> buffers<span style="color: #339933;">,</span> cached<span style="color: #339933;">,</span> item_count<span style="color: #339933;">,</span> i<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">char</span> essential_names<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">32</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;MemTotal&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;MemFree&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Committed_AS&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Cached&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> essential_values<span style="color: #009900;">&#91;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_names<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_names<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;;</span>sleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>fp_meminfo <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/proc/meminfo&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			err<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;can't read /proc/meminfo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>memset<span style="color: #009900;">&#40;</span>essential_values<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				item_count <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				item_count<span style="color: #339933;">;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>feof<span style="color: #009900;">&#40;</span>fp_meminfo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> errexit<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;can't read all essential information&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			fscanf<span style="color: #009900;">&#40;</span>fp_meminfo<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot; %31[^:]%*[^ ]%d%*[^<span style="color: #000099; font-weight: bold;">\n</span>]&quot;</span><span style="color: #339933;">,</span> item_name<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>item_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;&amp;</span> 
					strcmp<span style="color: #009900;">&#40;</span>essential_names<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> item_name<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					essential_values<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> item_value<span style="color: #339933;">;</span>
					<span style="color: #339933;">--</span>item_count<span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		set_overcommitted_limit<span style="color: #009900;">&#40;</span>
			<span style="color: #009900;">&#40;</span>essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">*</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">/</span> essential_values<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		fclose<span style="color: #009900;">&#40;</span>fp_meminfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>这段程序需要管理员权限运行，把它设置成开机必执行工具之一，同时在<code>/etc/sysctl.conf</code>上加上相关设置，就十分和谐啦 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p><p>就这一方面，可能还是openSolaris的做法最和谐，不过仅仅这一点并不能让我投奔openSolaris，把它作为日常使用的系统。默默地期待openSolaris和Linux都越来越好吧～</string></errno></err></stdlib></stdio></unistd></pre> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/limited-memory/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>电脑不够快</title><link>http://lihdd.net/slow-computer/</link> <comments>http://lihdd.net/slow-computer/#comments</comments> <pubDate>Tue, 28 Apr 2009 08:47:19 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category><guid
isPermaLink="false">http://lihdd.net/?p=140</guid> <description><![CDATA[电脑围棋现在处于童年甚至婴儿时代 ——陈志行　　 在一个论坛中有这样一个新手求助的帖子： 昨天，我用C语言写了一个程序，用来计算一个小学问题：在4*4的方格里填1~16，使横、竖、斜都相等。结果，计算机算了半天，没结果。而cpu使用为100%，我检查过了，不是死循环。我估算了一下，是计算次数太多了，我的电脑不够快。先将程序源代码贴出来，大家帮我想想办法。哪位有高级计算机，帮我算一下，谢谢！ #include&#60;stdio .h&#62; int main&#40;&#41;&#123; int e2&#40;int x&#41;; unsigned int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,num1,term1,num2,term2; num1=term1=num2=term2=0; while&#40;num1&#60;2000000000&#41;&#123; //translate num1 to a1~a8 a1=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a2=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a3=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a4=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a5=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a6=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a7=num1%16+1; num1=&#40;num1-num1%16&#41;/16; a8=num1%16+1; num1=&#40;num1-num1%16&#41;/16; num1=term1=term1+1; while&#40;num2&#60;2000000000 &#38;&#38; a1+a2+a3+a4==34 &#38;&#38; a7+a5+a6+a8==34 &#38;&#38; a8!=1 &#41;&#123; //translate num1 to a9~a16 a9=num2%16+1; num2=&#40;num2-num2%16&#41;/16; a10=num2%16+1; num2=&#40;num2-num2%16&#41;/16; a11=num2%16+1; num2=&#40;num2-num2%16&#41;/16; [...]]]></description> <content:encoded><![CDATA[<div
class="ias right"><div
class="inner"><img
class="size-full wp-image-141" title="goboard" src="http://lihdd.net/wp-content/uploads/2009/04/goboard.png" alt="围棋" width="96" height="90" align="right"/></div></div><p><em>电脑围棋现在处于童年甚至婴儿时代</em></p><p
style="text-align: right;"><em>——陈志行　　</em></p><p>在一个论坛中有这样一个新手求助的帖子：</p><blockquote><p>昨天，我用C语言写了一个程序，用来计算一个小学问题：在4*4的方格里填1~16，使横、竖、斜都相等。结果，计算机算了半天，没结果。而cpu使用为100%，我检查过了，不是死循环。我估算了一下，是计算次数太多了，我的电脑不够快。先将程序源代码贴出来，大家帮我想想办法。哪位有高级计算机，帮我算一下，谢谢！<br
/> <span
id="more-140"></span></p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include&lt;stdio .h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
 <span style="color: #993333;">int</span> e2<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> 
a1<span style="color: #339933;">,</span>a2<span style="color: #339933;">,</span>a3<span style="color: #339933;">,</span>a4<span style="color: #339933;">,</span>a5<span style="color: #339933;">,</span>a6<span style="color: #339933;">,</span>a7<span style="color: #339933;">,</span>a8<span style="color: #339933;">,</span>a9<span style="color: #339933;">,</span>a10<span style="color: #339933;">,</span>a11<span style="color: #339933;">,</span>a12<span style="color: #339933;">,</span>a13<span style="color: #339933;">,</span>a14<span style="color: #339933;">,</span>a15<span style="color: #339933;">,</span>a16<span style="color: #339933;">,</span>num1<span style="color: #339933;">,</span>term1<span style="color: #339933;">,</span>num2<span style="color: #339933;">,</span>term2<span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span>term1<span style="color: #339933;">=</span>num2<span style="color: #339933;">=</span>term2<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">2000000000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">//translate num1 to a1~a8</span>
 a1<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a2<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a3<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a4<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a5<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a6<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a7<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 a8<span style="color: #339933;">=</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num1<span style="color: #339933;">-</span>num1<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
 num1<span style="color: #339933;">=</span>term1<span style="color: #339933;">=</span>term1<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">2000000000</span> <span style="color: #339933;">&amp;&amp;</span> a1<span style="color: #339933;">+</span>a2<span style="color: #339933;">+</span>a3<span style="color: #339933;">+</span>a4<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a7<span style="color: #339933;">+</span>a5<span style="color: #339933;">+</span>a6<span style="color: #339933;">+</span>a8<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a8<span style="color: #339933;">!=</span><span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//translate num1 to a9~a16</span>
  a9<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a10<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a11<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a12<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a13<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a14<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a15<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  a16<span style="color: #339933;">=</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>num2<span style="color: #339933;">-</span>num2<span style="color: #339933;">%</span><span style="color:#800080;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>
  num2<span style="color: #339933;">=</span>term2<span style="color: #339933;">=</span>term2<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
&nbsp;
 <span style="color: #666666; font-style: italic;">//check  whether the translation works well. </span>
&nbsp;
 <span style="color: #666666; font-style: italic;">//printf(&quot;%d %d %d %d %d %d %d %d   %d %d\n%d %d %d %d%d%d%d%d%d%d\n________________\n\n&quot;,</span>
 <span style="color: #666666; font-style: italic;">// a1,a2,a3,a4,a5,a6,a7,a8,num1,term1,a9,a10,a11,a12,a13,a14,a15,a16,num2,term2);</span>
&nbsp;
&nbsp;
 <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a9<span style="color: #339933;">+</span>a10<span style="color: #339933;">+</span>a11<span style="color: #339933;">+</span>a12<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a13<span style="color: #339933;">+</span>a14<span style="color: #339933;">+</span>a15<span style="color: #339933;">+</span>a16<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span>  <span style="color: #339933;">&amp;&amp;</span>
  a1<span style="color: #339933;">+</span>a5<span style="color: #339933;">+</span>a9<span style="color: #339933;">+</span>a13<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a2<span style="color: #339933;">+</span>a6<span style="color: #339933;">+</span>a10<span style="color: #339933;">+</span>a14<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a3<span style="color: #339933;">+</span>a7<span style="color: #339933;">+</span>a11<span style="color: #339933;">+</span>a15<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> 
a4<span style="color: #339933;">+</span>a8<span style="color: #339933;">+</span>a12<span style="color: #339933;">+</span>a16<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span>
  a9<span style="color: #339933;">+</span>a14<span style="color: #339933;">+</span>a3<span style="color: #339933;">+</span>a8<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span> <span style="color: #339933;">&amp;&amp;</span> a5<span style="color: #339933;">+</span>a2<span style="color: #339933;">+</span>a15<span style="color: #339933;">+</span>a12<span style="color: #339933;">==</span><span style="color: #0000dd;">34</span>
  <span style="color: #339933;">&amp;&amp;</span> e2<span style="color: #009900;">&#40;</span>a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a2<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a3<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a4<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a5<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a6<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a7<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a8<span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a9<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a10<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a11<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a12<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a13<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a14<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a15<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>e2<span style="color: #009900;">&#40;</span>a16<span style="color: #009900;">&#41;</span>
<span style="color: #339933;">==</span><span style="color: #0000dd;">1022131070</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; %d %d %d %d<span style="color: #000099; font-weight: bold;">\n</span> %d %d %d %d<span style="color: #000099; font-weight: bold;">\n</span> %d %d %d %d<span style="color: #000099; font-weight: bold;">\n</span> %d %d %d %d<span style="color: #000099; font-weight: bold;">\n</span> %d %d<span style="color: #000099; font-weight: bold;">\n</span>%d %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a1<span style="color: #339933;">,</span>a2<span style="color: #339933;">,</span>a3<span style="color: #339933;">,</span>a4<span style="color: #339933;">,</span>a5<span style="color: #339933;">,</span>a6<span style="color: #339933;">,</span>a7<span style="color: #339933;">,</span>a8<span style="color: #339933;">,</span>a9<span style="color: #339933;">,</span>a10<span style="color: #339933;">,</span>a11<span style="color: #339933;">,</span>a12<span style="color: #339933;">,</span>a13<span style="color: #339933;">,</span>a14<span style="color: #339933;">,</span>a15<span style="color: #339933;">,</span>a16<span style="color: #339933;">,</span>num1<span style="color: #339933;">,</span>term1<span style="color: #339933;">,</span>num2<span style="color: #339933;">,</span>term2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  getchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
  <span style="color: #666666; font-style: italic;">//check whether the circle work well </span>
  <span style="color: #666666; font-style: italic;">//if(term2%10000000==0)</span>
  <span style="color: #666666; font-style: italic;">// printf(&quot;________2_________%d\n________1__________%d\n&quot;,term2/10000000,term1);</span>
 <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>term1<span style="color: #339933;">%</span><span style="color:#800080;">10000000</span><span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;________1__________%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>term1<span style="color: #339933;">/</span><span style="color: #0000dd;">10000000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
 <span style="color: #009900;">&#125;</span>
 num2<span style="color: #339933;">=</span>term2<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #666666; font-style: italic;">//getchar();</span>
 <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span> e2<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> x<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
 <span style="color: #993333;">int</span> sum<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>n<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>n<span style="color: #339933;">&lt;</span>x <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  sum<span style="color: #339933;">=</span>sum<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
  n<span style="color: #339933;">++;</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p></x></stdio></pre></blockquote><p>这段代码看着权当娱乐就好了，不过想一下，如果自己来写这样一个计算4阶幻方的程序，算出所有可能解，应该怎么做呢？</p><p>计算机的强大之处就是可以很快地重复执行很枯燥的工作，这一特性使得对于很多问题，只要把各种可能都试验一遍就可以了，比如像4阶幻方这样的问题。</p><p>虽然计算机可以算得很快，但是愚蠢的穷举方法会轻松导致失败，4阶幻方中，填好每行或者每列的前3个数后，第4个数只要用34减去前面3个数就好了。<br
/> 这样只要关心9个格子的数字，再考虑两条对角线之后，只要关心7个格子的数字就行了，总共要考虑16!/(16-9)! = 4151347200种情况（考虑对称和旋转之后还可以少许多），用下面的程序就可以算了：</p><div
class="wp_syntax"><div
class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio .h&gt;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">4</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N2 <span style="color: #000080;">=</span> N <span style="color: #000040;">*</span> N<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> M <span style="color: #000080;">=</span> N <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> S <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">+</span> N2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> N <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">-</span> N<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> u<span style="color: #008000;">&#91;</span>N2<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> d<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> updated<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> d<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>d <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">||</span> d <span style="color: #000080;">&gt;=</span> N2 <span style="color: #000040;">||</span> u<span style="color: #008000;">&#91;</span>d<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">::</span><span style="color: #007788;">d</span> <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">::</span><span style="color: #007788;">d</span> <span style="color: #000080;">==</span> d<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #008080;">::</span><span style="color: #007788;">d</span> <span style="color: #000080;">=</span> d<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> printout<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;-----&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> k <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d &quot;</span>, a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> y, <span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    d <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y <span style="color: #000080;">==</span> M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int</span> q <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                q <span style="color: #000040;">+</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>M <span style="color: #000040;">-</span> j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>updated<span style="color: #008000;">&#40;</span>q<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int</span> q <span style="color: #000080;">=</span> S<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                q <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>M<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> a<span style="color: #008000;">&#91;</span>M <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>q <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>updated<span style="color: #008000;">&#40;</span>q <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> q <span style="color: #000080;">=</span> S<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> M<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> q <span style="color: #000040;">-</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>x<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>updated<span style="color: #008000;">&#40;</span>q<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            a<span style="color: #008000;">&#91;</span>M<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>M<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
            printout<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> q <span style="color: #000080;">=</span> S<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> M<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> q <span style="color: #000040;">-</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>y<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>updated<span style="color: #008000;">&#40;</span>q<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> d<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        u<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        a<span style="color: #008000;">&#91;</span>y<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>x<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> f<span style="color: #008000;">&#40;</span>y <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span> f<span style="color: #008000;">&#40;</span>y, x <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        u<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N2<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>u<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                u<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                a<span style="color: #008000;">&#91;</span>y<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>x<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> f<span style="color: #008000;">&#40;</span>y <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">else</span> f<span style="color: #008000;">&#40;</span>y, x <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                u<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    f<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>半秒钟内就可以算出来全部的7040个解。上面的程序还可以处理其他阶的幻方，当N = 5时，算出来第一个解都要等待几分钟，实在太慢了。</p><p>上面的程序是一格一格地填，那么能不能一行一行地填呢？可以的，事先把一行的填法全部算出来，然后我采用这样的顺序：先填第一横行，再填第一竖行，再填第二横行，第二竖行…… 直到填完。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt; stdio.h &gt;</span>
<span style="color: #339900;">#include &lt; string.h &gt;</span>
<span style="color: #339900;">#include &lt; algorithm &gt;</span>
<span style="color: #339900;">#include &lt; vector &gt;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N2 <span style="color: #000080;">=</span> N <span style="color: #000040;">*</span> N<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> M <span style="color: #000080;">=</span> N <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> H <span style="color: #000080;">=</span> N <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> S <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">+</span> N2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> N <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">-</span> N<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> u<span style="color: #008000;">&#91;</span>N2<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span> <span style="color: #0000ff;">int</span> T <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> Row <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> a_<span style="color: #008000;">&#91;</span>T<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
&nbsp;
    Row<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    Row<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> a_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> set<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> index, <span style="color: #0000ff;">int</span> value<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        a_<span style="color: #008000;">&#91;</span>index<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> get<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> index<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> a_<span style="color: #008000;">&#91;</span>index<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> operator<span style="color: #000080;">&lt;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Row<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> that<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> T<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> that.<span style="color: #007788;">a_</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> that.<span style="color: #007788;">a_</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> operator <span style="color: #000080;">==</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Row<span style="color: #000080;">&lt;</span> t <span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> that<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> T<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> that.<span style="color: #007788;">a_</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> match<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> l<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> l<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
vector<span style="color: #000080;">&lt;</span> Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span> t<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> rl, rr<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> printout<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;-----&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> k <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d &quot;</span>, a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> d<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> N<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">//check '\'</span>
        <span style="color: #0000ff;">int</span> s <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> s <span style="color: #000040;">+</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s <span style="color: #000080;">==</span> S<span style="color: #008000;">&#41;</span> printout<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">:</span>
            <span style="color: #666666;">// Direction: Hor --</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> h<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i <span style="color: #000080;">&gt;=</span> n <span style="color: #008080;">?</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">:</span> a<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span> Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> l <span style="color: #000080;">=</span> lower_bound<span style="color: #008000;">&#40;</span>t.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, t.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    l <span style="color: #000040;">!</span><span style="color: #000080;">=</span> t.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> match<span style="color: #008000;">&#40;</span>h, n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> l<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">//check unused</span>
                <span style="color: #0000ff;">bool</span> flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
                        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #666666;">//try it</span>
                    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> u<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                    <span style="color: #666666;">//check /</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>N <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000080;">==</span> H<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">int</span> s <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> k <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> s <span style="color: #000040;">+</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>M <span style="color: #000040;">-</span> k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                        flag <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>s <span style="color: #000080;">==</span> S<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
&nbsp;
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span> f<span style="color: #008000;">&#40;</span>n <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> u<span style="color: #008000;">&#91;</span>l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
            <span style="color: #666666;">// Direction: Ver |</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> h<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i <span style="color: #000080;">&gt;=</span> n <span style="color: #008080;">?</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">:</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span> Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> l <span style="color: #000080;">=</span> lower_bound<span style="color: #008000;">&#40;</span>t.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, t.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    l <span style="color: #000040;">!</span><span style="color: #000080;">=</span> t.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>match<span style="color: #008000;">&#40;</span>h, n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> l<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">//check unused</span>
                <span style="color: #0000ff;">bool</span> flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#91;</span>l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
                        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #666666;">//try it</span>
                    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                        u<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                    <span style="color: #666666;">//check /</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>N <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000080;">==</span> H<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">int</span> s <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> k <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> s <span style="color: #000040;">+</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>M <span style="color: #000040;">-</span> k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                        flag <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>s <span style="color: #000080;">==</span> S<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span> f<span style="color: #008000;">&#40;</span>n, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
                    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                        u<span style="color: #008000;">&#91;</span>l <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> get<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> gen<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i, <span style="color: #0000ff;">int</span> l<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">==</span> M<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> l <span style="color: #000080;">&lt;</span> N2 <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>u<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            h<span style="color: #008000;">&#91;</span>M<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> l<span style="color: #008080;">;</span>
            t.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>Row<span style="color: #000080;">&lt;</span> N <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> N2<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>u<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&gt;=</span> j<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    u<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> h<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
                    gen<span style="color: #008000;">&#40;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, l <span style="color: #000040;">-</span> j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    u<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    gen<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, S<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    f<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>这里实际上用空间换取了时间，事先计算出来的一行的所有排法需要占用空间，而后可以算得快一些。而并不是所有时候都可以用空间换时间，必须要在有重复或类似的状态出现时才有可能用空间换取时间。</p><p>实际用这个程序算五阶幻方，几秒钟内就可以算出来第一个解，剩下的解也可以源源不断地算出来，但是要算出所有解，看起来要用很多个小时，还是很慢。</p><p>还可以考虑一次填一横行和一竖行，这样需要更多的空间，更复杂的程序，也不一定会快到哪里，我并没有去实现它。</p><p>5阶幻方，这个看起来很简单的事情，实际上用电脑来算，却是十分的不容易，即便程序已经优化得复杂度降了一维又一维，但是仍然慢得无法忍受，而且伴随着速度加快，还有内存不够用的危险。</p><p>高中的时候，我曾经在自己的电脑上想算出3阶魔方的所有状态，但是没有算完第4步就遇到了内存不够和速度不能忍的问题：</p><div
class="wp_syntax"><div
class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">program</span> magic_square<span style="color: #000066;">;</span>
<span style="color: #008000; font-style: italic;">{$APPTYPE CONSOLE}</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">const</span> debug<span style="color: #000066;">=</span><span style="color: #0000ff;">1</span><span style="color: #000066;">;</span>
      MAX_PERMUTATION_ELEMENTS_COUNT<span style="color: #000066;">=</span><span style="color: #0000ff;">20</span><span style="color: #000066;">;</span>
      MAX_PERMUTATION_COUNT<span style="color: #000066;">=</span><span style="color: #0000ff;">50000</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">type</span>
     TInt<span style="color: #000066;">=</span><span style="color: #000066; font-weight: bold;">longword</span><span style="color: #000066;">;</span>
     TPermutation<span style="color: #000066;">=</span><span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">..</span><span style="color: #006600;">MAX_PERMUTATION_ELEMENTS_COUNT</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">word</span><span style="color: #000066;">;</span>
     TLink<span style="color: #000066;">=</span><span style="color: #000000; font-weight: bold;">record</span> prev<span style="color: #000066;">,</span>next<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
     ECompare<span style="color: #000066;">=</span><span style="color: #000066;">&#40;</span>Bigger<span style="color: #000066;">,</span>Smaller<span style="color: #000066;">,</span>Equal<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  Pers<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">packed</span> <span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">..</span><span style="color: #006600;">MAX_PERMUTATION_COUNT</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> TPermutation<span style="color: #000066;">;</span>
  PersIndex<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">packed</span> <span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">..</span><span style="color: #006600;">MAX_PERMUTATION_COUNT</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> TInt<span style="color: #000066;">;</span>
  PersCount<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
&nbsp;
  PerTemp<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">;</span>
  <span style="color: #808080; font-style: italic;">{PersLinkTable:array [0..MAX_PERMUTATION_COUNT] of TLink;}</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">{
   Data struct:
     PersLinkTable[i].next  : (Element Pers[i])'s next element's index, 0 : Tail
                     .prev  : (Element Pers[i])'s previous element's index, 0 : Tail
     PersLinkTable[0].next  : Head index
     -&gt;Use binary search, not use PersLinkTable
  }</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Permutation functions//////////////////////////</span>
<span style="color: #808080; font-style: italic;">{
procedure PersLinkTableInit;
begin
  PersCount:=0;
  fillchar(PersLinkTable,sizeof(PersLinkTable),0);
  PersLinkTable[0].next:=1;
end;
}</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> PersCompare<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> a<span style="color: #000066;">,</span>b<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span>ECompare<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> i<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> MAX_PERMUTATION_ELEMENTS_COUNT <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> a<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> &gt; b<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span> result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>Bigger<span style="color: #000066;">;</span>exit <span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span>
    <span style="color: #000000; font-weight: bold;">if</span> a<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> &lt; b<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span> result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>Smaller<span style="color: #000066;">;</span>exit <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
  Result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>Equal<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> PersBinarySearch<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> a<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> l<span style="color: #000066;">,</span>r<span style="color: #000066;">,</span>m<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  l<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span><span style="color: #000066;">;</span>r<span style="color: #000066;">:</span><span style="color: #000066;">=</span>PersCount<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">while</span> l&lt;<span style="color: #000066;">=</span>r <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">begin</span>
    m<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #000066;">&#40;</span>l<span style="color: #000066;">+</span>r<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">2</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">case</span> PersCompare<span style="color: #000066;">&#40;</span>a<span style="color: #000066;">,</span>Pers<span style="color: #000066;">&#91;</span>PersIndex<span style="color: #000066;">&#91;</span>m<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">of</span>
    Equal<span style="color: #000066;">:</span>
      <span style="color: #808080; font-style: italic;">//本应该返回mid, 但是直接处理掉重复，返回0</span>
      <span style="color: #000000; font-weight: bold;">begin</span> result<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span><span style="color: #000066;">;</span>exit<span style="color: #000066;">;</span>end<span style="color: #000066;">;</span>
    Bigger<span style="color: #000066;">:</span>
      l<span style="color: #000066;">:</span><span style="color: #000066;">=</span>m<span style="color: #000066;">+</span><span style="color: #0000ff;">1</span><span style="color: #000066;">;</span>
    Smaller<span style="color: #000066;">:</span>
      r<span style="color: #000066;">:</span><span style="color: #000066;">=</span>m<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
  <span style="color: #808080; font-style: italic;">//此时，l= (&gt;a的第一个元素)</span>
  Result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>l<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">procedure</span> PersInsert<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> a<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> i<span style="color: #000066;">,</span>p<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  p<span style="color: #000066;">:</span><span style="color: #000066;">=</span>PersBinarySearch<span style="color: #000066;">&#40;</span>a<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span> p&gt;<span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span>
    <span style="color: #000000; font-weight: bold;">if</span> PersCount&gt;<span style="color: #000066;">=</span>MAX_PERMUTATION_COUNT <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span>
       <span style="color: #000066;">writeln</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Over flow!'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
       <span style="color: #000066;">readln</span><span style="color: #000066;">;</span>
       <span style="color: #000066;">halt</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">//Move Pers[p..PersCount] to Pers[p+1..PersCount+1]</span>
    <span style="color: #000066;">inc</span><span style="color: #000066;">&#40;</span>PersCount<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> PersCount <span style="color: #000000; font-weight: bold;">mod</span> <span style="color: #0000ff;">1000</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000066;">writeln</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'  Count: '</span><span style="color: #000066;">,</span>PersCount<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    <span style="color: #000066;">Move</span><span style="color: #000066;">&#40;</span>PersIndex<span style="color: #000066;">&#91;</span>p<span style="color: #000066;">&#93;</span><span style="color: #000066;">,</span>PersIndex<span style="color: #000066;">&#91;</span>p<span style="color: #000066;">+</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">,</span><span style="color: #000066;">&#40;</span>PersCount<span style="color: #000066;">-</span>p<span style="color: #000066;">&#41;</span><span style="color: #000066;">*</span><span style="color: #000066;">sizeof</span><span style="color: #000066;">&#40;</span>PersCount<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
    Pers<span style="color: #000066;">&#91;</span>PersCount<span style="color: #000066;">&#93;</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span>a<span style="color: #000066;">;</span>
    PersIndex<span style="color: #000066;">&#91;</span>p<span style="color: #000066;">&#93;</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span>PersCount<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">procedure</span> PersCreat<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> a<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">;</span>ProvidedLength<span style="color: #000066;">:</span><span style="color: #000066; font-weight: bold;">Word</span><span style="color: #000066;">;</span>Content<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Word</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> i<span style="color: #000066;">:</span><span style="color: #000066; font-weight: bold;">word</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
     <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> MAX_PERMUTATION_ELEMENTS_COUNT <span style="color: #000000; font-weight: bold;">do</span> a<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span>i<span style="color: #000066;">;</span>
     <span style="color: #808080; font-style: italic;">//注意:Content array 下标从0开始</span>
     <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> ProvidedLength<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span>
         a<span style="color: #000066;">&#91;</span>Content<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span>Content<span style="color: #000066;">&#91;</span>ProvidedLength<span style="color: #000066;">+</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">procedure</span> PersMultiply<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> MulResult<span style="color: #000066;">,</span>a<span style="color: #000066;">,</span>b<span style="color: #000066;">:</span>TPermutation<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> i<span style="color: #000066;">:</span><span style="color: #000066; font-weight: bold;">word</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
     <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> MAX_PERMUTATION_ELEMENTS_COUNT <span style="color: #000000; font-weight: bold;">do</span>
         MulResult<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span>b<span style="color: #000066;">&#91;</span>a<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #808080; font-style: italic;">/////////////////////////////////////////////////</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span>
    LastPersCount<span style="color: #000066;">:</span>TInt<span style="color: #000066;">;</span>
    i<span style="color: #000066;">,</span>j<span style="color: #000066;">,</span>k<span style="color: #000066;">:</span><span style="color: #000066; font-weight: bold;">word</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  PersCount<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span><span style="color: #000066;">;</span>
  LastPersCount<span style="color: #000066;">:</span><span style="color: #000066;">=</span>PersCount<span style="color: #000066;">;</span>
<span style="color: #808080; font-style: italic;">{
                 +--------+
                 |13 14 15|
                 |16    17|
                 |18 19 20|
         +-------+--------+
         |9    10|
         |       |
         |11   12|
 +-------+-------+
 |1  2  3|
 |4     5|
 |6  7  8|
 +-------+
 注意:每个面的面心固定住，
 因为无论怎么转，都可得到本质相同的情况（考虑一步即可）
}</span>
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span><span style="color: #0000ff;">5</span><span style="color: #000066;">,</span><span style="color: #0000ff;">6</span><span style="color: #000066;">,</span><span style="color: #0000ff;">7</span><span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
   <span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">5</span><span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span><span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><span style="color: #0000ff;">7</span><span style="color: #000066;">,</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span><span style="color: #0000ff;">6</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Front side</span>
&nbsp;
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">13</span><span style="color: #000066;">,</span><span style="color: #0000ff;">14</span><span style="color: #000066;">,</span><span style="color: #0000ff;">15</span><span style="color: #000066;">,</span><span style="color: #0000ff;">16</span><span style="color: #000066;">,</span><span style="color: #0000ff;">17</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">,</span><span style="color: #0000ff;">19</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span>
   <span style="color: #0000ff;">15</span><span style="color: #000066;">,</span><span style="color: #0000ff;">17</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span><span style="color: #0000ff;">14</span><span style="color: #000066;">,</span><span style="color: #0000ff;">19</span><span style="color: #000066;">,</span><span style="color: #0000ff;">13</span><span style="color: #000066;">,</span><span style="color: #0000ff;">16</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Back side</span>
&nbsp;
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">9</span><span style="color: #000066;">,</span><span style="color: #0000ff;">13</span><span style="color: #000066;">,</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span><span style="color: #0000ff;">16</span><span style="color: #000066;">,</span><span style="color: #0000ff;">6</span><span style="color: #000066;">,</span><span style="color: #0000ff;">11</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">,</span>
   <span style="color: #0000ff;">13</span><span style="color: #000066;">,</span><span style="color: #0000ff;">16</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">,</span><span style="color: #0000ff;">9</span><span style="color: #000066;">,</span><span style="color: #0000ff;">11</span><span style="color: #000066;">,</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span><span style="color: #0000ff;">6</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Left side</span>
&nbsp;
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">10</span><span style="color: #000066;">,</span><span style="color: #0000ff;">15</span><span style="color: #000066;">,</span><span style="color: #0000ff;">5</span><span style="color: #000066;">,</span><span style="color: #0000ff;">17</span><span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span><span style="color: #0000ff;">12</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span>
  <span style="color: #0000ff;">15</span><span style="color: #000066;">,</span><span style="color: #0000ff;">17</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span><span style="color: #0000ff;">10</span><span style="color: #000066;">,</span><span style="color: #0000ff;">12</span><span style="color: #000066;">,</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">5</span><span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Right side</span>
&nbsp;
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">9</span><span style="color: #000066;">,</span><span style="color: #0000ff;">10</span><span style="color: #000066;">,</span><span style="color: #0000ff;">13</span><span style="color: #000066;">,</span><span style="color: #0000ff;">14</span><span style="color: #000066;">,</span><span style="color: #0000ff;">15</span><span style="color: #000066;">,</span>
  <span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><span style="color: #0000ff;">10</span><span style="color: #000066;">,</span><span style="color: #0000ff;">15</span><span style="color: #000066;">,</span><span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><span style="color: #0000ff;">14</span><span style="color: #000066;">,</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><span style="color: #0000ff;">9</span><span style="color: #000066;">,</span><span style="color: #0000ff;">13</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Top side</span>
&nbsp;
  PersCreat<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">6</span><span style="color: #000066;">,</span><span style="color: #0000ff;">7</span><span style="color: #000066;">,</span><span style="color: #0000ff;">8</span><span style="color: #000066;">,</span><span style="color: #0000ff;">11</span><span style="color: #000066;">,</span><span style="color: #0000ff;">12</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">,</span><span style="color: #0000ff;">19</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span>
  <span style="color: #0000ff;">8</span><span style="color: #000066;">,</span><span style="color: #0000ff;">12</span><span style="color: #000066;">,</span><span style="color: #0000ff;">20</span><span style="color: #000066;">,</span><span style="color: #0000ff;">7</span><span style="color: #000066;">,</span><span style="color: #0000ff;">19</span><span style="color: #000066;">,</span><span style="color: #0000ff;">6</span><span style="color: #000066;">,</span><span style="color: #0000ff;">11</span><span style="color: #000066;">,</span><span style="color: #0000ff;">18</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">//Bottom side</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #0000ff;">10</span> <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">begin</span>
      <span style="color: #000066;">writeln</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#'</span><span style="color: #000066;">,</span>i<span style="color: #000066;">,</span><span style="color: #ff0000;">':'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
      LastPersCount<span style="color: #000066;">:</span><span style="color: #000066;">=</span>PersCount<span style="color: #000066;">;</span>
      <span style="color: #000000; font-weight: bold;">for</span> j<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> LastPersCount <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">for</span> k<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">to</span> LastPersCount <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">begin</span>
          PersMultiply<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">,</span>Pers<span style="color: #000066;">&#91;</span>j<span style="color: #000066;">&#93;</span><span style="color: #000066;">,</span>Pers<span style="color: #000066;">&#91;</span>k<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
          PersInsert<span style="color: #000066;">&#40;</span>PerTemp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
      <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
      <span style="color: #000066;">writeln</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Now Count: '</span><span style="color: #000066;">,</span>Perscount<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
      <span style="color: #000066;">readln</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> debug<span style="color: #000066;">=</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000066;">readln</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">.</span></pre></div></div><p>现在的CPU和内存和上面这个程序运行时已经有了很大进步，但执行上面的程序一定还没有希望获得结果。</p><p>目前的电脑还很慢……</stdio></pre> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/slow-computer/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>TLE回忆录</title><link>http://lihdd.net/tle-contest/</link> <comments>http://lihdd.net/tle-contest/#comments</comments> <pubDate>Mon, 09 Mar 2009 13:27:23 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[Life]]></category> <category><![CDATA[OJ]]></category> <category><![CDATA[TLE]]></category><guid
isPermaLink="false">http://lihdd.net/?p=29</guid> <description><![CDATA[TLE是Online Judge上很常见的一种错误：Time Limit Exceeded。它也是一年一度的趣味在线编程比赛，今年是首届，印度学生主办的（Link）。 说它“趣味”是因为它的题目别具一格，要求和评分标准也和普通的算法竞赛不一样，比如有比谁的代码最短的，有要把代码写成回文串的，不准代码中有空格的等等。 这次比赛的时间正好是寒假末期，我正好有时间参加，就注册了一个帐号去试了一下，发现果然是高手云集啊。 官方公布有解题报告，所有参赛代码也都在比赛完后开放。我本来也不想说最佳解法，只记一下我自己的流水账就好。其实这篇日志被我拖了很长时间了，就从“小结” 变成了“回忆录” CODEHASH 2月10日晚上，我开始看题目，一眼看过去，标题&#8221;#ed&#8221;挺有吸引力的，实际上就是CODEHASH那道题了，要求是用程序输出自己的Hash，Hash函数是 string IPsec_v9&#40;string a&#41; &#123; while &#40;a.size&#40;&#41; % 32 != 0&#41; a += &#34;IPsecV9&#34;; string ret = &#34;&#34;; for &#40;int i = 0; i &#60; 32; i++&#41; &#123; unsigned v = 0; for &#40;int j = i; j &#60; a.size&#40;&#41;; j += 32&#41; v = &#40;v [...]]]></description> <content:encoded><![CDATA[<div
class="ias right"><div
class="inner"><img
class="size-full wp-image-141" title="goboard" src="http://lihdd.net/wp-content/uploads/2009/03/tle.png" alt="TLE Logo" width="115" height="52" align="right"/></div></div><p>TLE是Online Judge上很常见的一种错误：Time Limit Exceeded。它也是一年一度的趣味在线编程比赛，今年是首届，印度学生主办的（<a
title="Time Limit Exceeded '09" href="http://felicity.iiit.ac.in/tle/judge">Link</a>）。  说它“趣味”是因为它的题目别具一格，要求和评分标准也和普通的算法竞赛不一样，比如有比谁的代码最短的，有要把代码写成回文串的，不准代码中有空格的等等。</p><p>这次比赛的时间正好是寒假末期，我正好有时间参加，就注册了一个帐号去试了一下，发现果然是高手云集啊。</p><p>官方公布有<a
href="http://felicity.iiit.ac.in/tle/TLEditorial.pdf">解题报告</a>，所有参赛代码也都在比赛完后开放。我本来也不想说最佳解法，只记一下我自己的流水账就好。其实这篇日志被我拖了很长时间了，就从“小结” 变成了“回忆录” <img
src='http://lihdd.net/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /> <span
id="more-29"></span></p><h5>CODEHASH</h5><p>2月10日晚上，我开始看题目，一眼看过去，标题&#8221;#ed&#8221;挺有吸引力的，实际上就是CODEHASH那道题了，要求是用程序输出自己的Hash，Hash函数是</p><div
class="wp_syntax"><div
class="code"><pre class="cpp" style="font-family:monospace;">string IPsec_v9<span style="color: #008000;">&#40;</span>string a<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>a.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">32</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
                a <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;IPsecV9&quot;</span><span style="color: #008080;">;</span>
        string ret <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">32</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">unsigned</span> v <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> a.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> j <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">32</span><span style="color: #008000;">&#41;</span>
                        v <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>v <span style="color: #000040;">*</span> <span style="color: #0000dd;">7</span> <span style="color: #000040;">+</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">26</span><span style="color: #008080;">;</span>
                ret <span style="color: #000040;">+</span><span style="color: #000080;">=</span> v <span style="color: #000040;">+</span> <span style="color: #FF0000;">'A'</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        reverse<span style="color: #008000;">&#40;</span>ret.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,ret.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> ret<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>程序越短越好，很容易想到用C来写这个程序：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>应该是最短的了，但是构造puts里面的hash字符串却不容易。hash函数中有一句reverse()，就让构造这个字符串的难度又加大了。我稍微试验了一下，觉得必须要在程序中把字符串倒过来才能完成任务。下面这行是我想到的C语言中把字符串倒过来的最短的代码：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">b<span style="color: #339933;">=</span><span style="color: #0000dd;">32</span><span style="color: #339933;">;</span>main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>b<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>putchar<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;</span><span style="color: #009900;">&#91;</span>b<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>成功构造出这里的hash字符串要比上面的那段要高许多许多倍。构造出上面那段程序的hash的成功率大约是这里的十六次方（具体是什么原因，自己分析看看吧 :P）。</p><p>我自己开始很粗心，把b=32写成了b=33，多输出一个&#8217;\0&#8242;。这个错误在调试的时候观察不到，交上去总是错误，怀疑是对方的评测系统有问题，我就给TLE管理员发了一个消息，管理员很热情，让我把程序输出重定向到文件里和预期结果比较一下，我这才发现了问题。交上去的时候已经有五个人的代码比我短了，而自己一直坚持必须要有把字符串倒过来输出这个过程，又想不到更短的写法，对这题只好郁郁而终了。</p><h5>PENGUIN</h5><p>在我寻思着下面该做哪道题时，突然看到了我的一个好友刚交了PENGUIN这题，于是我就跟风去看那题。</p><p>这题是要输出一个<a
href="http://felicity.iiit.ac.in/tle/Penguin.txt">字符拼成的企鹅</a>。这个企鹅中有制表符、空格、点、下划线等11种字符，中间有连续的相同字符，很容易想到<a
href="http://en.wikipedia.org/wiki/Run-length_encoding">RLE压缩</a>。这里就看谁可以压缩得更多些了，我在调试的时候发现代码中的ASCII字符超过127就很容易被编译器判错，最后我只用了安全的从空格到127的ASCII字符：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> s<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;$!(#f#(%{{q(zR(%{{g#zp#(%{{](zz4#%{{S#zzH#%{{SzzR)#%{{S47fAp#%{{I(*#5-H#I#f%{{I#*+ (+&gt;#+*(+f%{{I#*!4+&gt;#!&gt;+#<span style="color: #000099; font-weight: bold;">\\</span>%{{I$*!$*+&gt;#(!*$+f%{{S*!U*K(5f%{{S*K(A(_f%{{S# $A$A$K$#p(%{{S#*(}-$5z%{{S#*#!$i$I#z(%{{I(*I$A$g$z(%{{5(&gt;{{!$p(%{{!(&gt;{{I$p(%{q(H#{{Sz(%{g(H#${{Sz (%{](R7({!(]27'z #(%{S(<span style="color: #000099; font-weight: bold;">\\</span>.S$7.{+.-z*(%{SR{+#{g$-z*%{I#&gt;#${+#{{$z*#%{?(H{?#{{!-z*%{?&gt;#${{{S-z*%{?&gt;{I({{+-z*(%{(#R{I#{{+-z*-%{f{I#{{+-z4#%{f{I#{{+-z4#%{$#R{I${{+-z*#$%{+(#(!*#({{{I(#z4$%{U($*#({+#{g(-!z $#%+(}K($&gt;({{gA$f$7(%+}i($H{{SK($(*($U(%+}}($&gt;#({{5_(.s%+$}}#($*#${{!($}}2%?}}#($*{{(-!}}7%+(}}7(!*{I(-&gt;!}}7%+}}K($42g(-<span style="color: #000099; font-weight: bold;">\\</span>!}}$%+$}}K!zz4!}_$%?$}}7!zz4!}K$%g$}s'R-8-z!$}-$%{5.#(}${{?<span style="color: #000099; font-weight: bold;">\&quot;</span>('$U.%&quot;</span><span style="color: #339933;">,</span>b<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;x `:'<span style="color: #000099; font-weight: bold;">\n</span>  _.X&quot;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">,</span>t<span style="color: #339933;">;</span>main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">640</span><span style="color: #339933;">;</span>s<span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span><span style="color: #0000dd;">32</span><span style="color: #009900;">&#41;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>t<span style="color: #339933;">=</span>s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>t<span style="color: #339933;">--+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>putchar<span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">%</span><span style="color:#800080;">10</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>后来我发现大部分人都使用了我认为不安全的字符，也许他们是用gcc3.x编译的（提交时可以选择gcc3.x或者是4.x）？不过在本地没有这版本的编译器的情况下，这样提交起来调试总会不方便吧。这道题我第一次提交的时候排在第四，最后一次提交时排在第三，比赛结束时就排到十几了，看来大家都非常努力呢。</p><h5>KEY</h5><p>之后我就开始看第一题，KEY，是要判断一个数字的二进制形式是否回文，越短越好，同时要尽量少用C语言关键字，如果程序本身是回文的话，有额外奖励。</p><p>很容易想到循环地除以二取余数，把结果放到数组里，再用for循环从头到尾比较一下，但是这样的话程序就比较长了。循环除以二取余数的时候，可以把余数结果用不同的方向写回一个整数中，写回去的这个整数就是原数二进制倒过来的样子，和原数相等就是回文了。</p><p>为了避免for关键字， 我把所有的for都改成了函数，递归调用的形式：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">c<span style="color: #339933;">,</span>n<span style="color: #339933;">,</span>m<span style="color: #339933;">,</span>s<span style="color: #339933;">;</span>
q<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>n<span style="color: #339933;">&amp;&amp;</span>q<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">/=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span>s<span style="color: #339933;">+=</span><span style="color: #009900;">&#40;</span>n<span style="color: #339933;">&amp;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
p<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>c<span style="color: #339933;">--&amp;&amp;</span>p<span style="color: #009900;">&#40;</span>puts<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">^</span>m<span style="color: #339933;">?</span><span style="color: #ff0000;">&quot;NO&quot;</span><span style="color: #339933;">:</span><span style="color: #ff0000;">&quot;YES&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>q<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>s<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>m<span style="color: #339933;">=</span>n<span style="color: #339933;">,</span>scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>让程序代码本身是回文的比较容易，把上面的程序写在了一行，然后加了双斜杠注释，把程序倒过来再写一遍就行了。上面的代码已经基本没有可读性了，但总体看来，还有很大的缩短余地。<a
href="http://felicity.iiit.ac.in/tle/judge/show.py?id=8010">这里</a>是得分最高的程序。</p><h5>SHORTEN</h5><p>按照顺序，下一个处理的是SHORTEN这道题。题目要求把一段不知道做什么的很长的程序改短，并要保证和源程序对同一输入有一样的输出。这道题给的源代码我没看明白，只是在表面上改一改，最后得分很低。很多人都在这里拿到了<a
title="SHORTEN得分列表" href="http://felicity.iiit.ac.in/tle/judge/best?pid=SHORTEN">超过1000分</a>，这相当于我做的五题，十分可怕 :neutral:</p><h5>INPOUT</h5><p>接下来是INPOUT这题，要求写程序读入固定的<a
href="http://felicity.iiit.ac.in/tle/ProduceTheCode.in">输入</a>，然后给出固定的<a
href="http://felicity.iiit.ac.in/tle/ProduceTheCode.out">输出</a>，当然，程序越短越好。观察一下就知道输出是把输入的字符打乱顺序，然后把某些字符替换掉，比如b换成d，p换成q等等，然后程序就写出来啦：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">120</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>n<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">120</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>r<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;dbbdwmmwpq2569WM&quot;</span><span style="color: #339933;">;</span>
l<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>t<span style="color: #339933;">,</span>c<span style="color: #339933;">,</span>k<span style="color: #339933;">;</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>gets<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    n<span style="color: #009900;">&#91;</span>l<span style="color: #339933;">=</span>strlen<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>t<span style="color: #339933;">=</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>t<span style="color: #339933;">&lt;</span>l<span style="color: #339933;">;</span>i<span style="color: #339933;">=++</span>t<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      c<span style="color: #339933;">=</span>s<span style="color: #009900;">&#91;</span>t<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>k<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;!</span><span style="color: #009900;">&#40;</span>k<span style="color: #339933;">&amp;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;&amp;</span>k<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">15</span><span style="color: #339933;">;</span>k<span style="color: #339933;">+=</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
        c<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>c<span style="color: #339933;">==</span>r<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">?</span>r<span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      n<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">&lt;=</span>l<span style="color: #339933;">?</span>i<span style="color: #339933;">-</span>l<span style="color: #339933;">|</span><span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>c<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    puts<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><h5>CLASS</h5><p>再下面就是CLASS这道题了，题目要求很简单，不用空白字符、不用除号、不用#define声明一个class multiply，要求这个class含有一个mult(int a, int b)的方法，能输出a和b的乘积。裁判程序会创建一个这个类的实例，然后调用这个方法测试。</p><p>正常的程序许多地方要用到空格，比如int a，这个不难办，可以用int*a绕过去，或者可以用__typeof(int)a这样来声明。输出可以用cout&lt;&lt;a*b&lt;&lt;endl;，没有空格。问题是如何不用空白字符定义这个class，由于class不是一个确定的类型，所以不能用__typeof(class)，同样地，也不能__typeof(struct)。</p><p>在TLE讨论区官方提示说可以试试typedef，可我在查阅了typedef的各种文档，尝试了模板、匿名类等之后还不能消除typedef后面的空格。最后我发现评测系统只检查了空格、制表符和换行这三种常见的空白字符，我就把空格换成了&#8217;\f&#8217;(form feed)这个空白字符，居然侥幸地通过了 :D 最后发现还有很多人也用了这种方法通过的。尽管这样，这道题通过的也只有二十几个人，看来大家普遍玩不转C语言语法啊。</p><p>官方解答是把typedef这样用：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">class<span style="color: #009900;">&#123;</span>public<span style="color: #339933;">:</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span>mult<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>cout<span style="color: #339933;">&lt;&lt;</span>a<span style="color: #339933;">*</span>b<span style="color: #339933;">&lt;&lt;</span>endl<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #993333;">typedef</span><span style="color: #009900;">&#40;</span>multiply<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>其实还有一些不常用的宏可以帮忙，在sys/cdefs.h里面有这样一行：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define __CONCAT(x,y)   x ## y</span></pre></div></div><p>有人就用了__CONCAT(c,lass)multiply这样的写法，也能越过class后面的空格，没有用到typedef。</p><h5>PRINT</h5><p>这道题比较经典，要求输出程序源代码，还要根据输入数字的奇偶来选择正序或者倒序来输出程序，程序越短越好。如果程序是回文的，有额外奖励。</p><p>我想，这个要求看来是一定要把程序写成回文的了。 以前做过这样的题目，所以写出来也不是很难。要实现回文，同KEY一样，加两个除号再把程序倒过来写一遍就行了。</p><h5>THINK</h5><p>这里开始就是我在学校时做的题目了，这道题的名字是“Give it a try.”，于是我就先来试试吧。题目很有趣，是三段密文，需要动动脑筋猜出题目是什么才可以做。</p><p>第一段很简单，把大写字母提取出来就看到是什么了。按照第一段提示，把第二段每行的奇数位置的字符取出来，看到这样的二进制串：</p><pre>1010111110001011
1000100100001001
0110100111010001
0111100111110001
0110100100111001
0110100111010001
1011000101111001
1111000111111011
......</pre><p>我发现有两竖行全是1，就想这可能是ASCII字符吧，把这些二进制数取反后倒过来，再转换成ASCII字符，就看到一些有意义的字符。最后几行是这样的：</p><pre>ot
e
mo
cl
eW</pre><p>下面该怎么做就很明显了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 第三个密文比较难，我当时没有解出来。</p><h5>ARBIT</h5><p>同上面的SHORTEN有点像ARBIT这个题目也是要精简代码，不过要求在同时提高运行效率。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include&lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">unsigned</span> x<span style="color: #008080;">;</span>
<span style="color: #0000ff;">unsigned</span> f1<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>a<span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>a<span style="color: #000040;">^</span>b<span style="color: #008080;">:</span>f1<span style="color: #008000;">&#40;</span>a<span style="color: #000040;">^</span>b,<span style="color: #008000;">&#40;</span>a<span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">unsigned</span> f2<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> a<span style="color: #000080;">&gt;=</span>b<span style="color: #008080;">?</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>b<span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>a<span style="color: #008080;">:</span>f2<span style="color: #008000;">&#40;</span>a<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,b<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>f2<span style="color: #008000;">&#40;</span>a,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">unsigned</span> f3<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">!</span>a<span style="color: #008080;">?</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>~f2<span style="color: #008000;">&#40;</span>f1<span style="color: #008000;">&#40;</span>~<span style="color: #008000;">&#40;</span>f3<span style="color: #008000;">&#40;</span>a<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span>,b<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>,<span style="color: #000040;">-</span><span style="color: #008000;">&#40;</span>~a<span style="color: #000040;">&amp;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>,b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">unsigned</span> f4<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b,<span style="color: #0000ff;">unsigned</span> c<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>min<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>c<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #008000;">&#40;</span>~<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #008000;">&#40;</span>max<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>f3<span style="color: #008000;">&#40;</span>a,c<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>f3<span style="color: #008000;">&#40;</span>b,c<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>~x<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>c<span style="color: #008080;">:</span>f4<span style="color: #008000;">&#40;</span>a,b,c<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>
<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #008000;">&#40;</span>max<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>f3<span style="color: #008000;">&#40;</span>a,c<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>f3<span style="color: #008000;">&#40;</span>b,c<span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>~x<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>~x<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>c<span style="color: #008080;">:</span>f4<span style="color: #008000;">&#40;</span>a,b,c<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">unsigned</span> f5<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b,<span style="color: #0000ff;">unsigned</span> c<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">unsigned</span> x<span style="color: #000080;">=</span>f4<span style="color: #008000;">&#40;</span>a,c,c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> c<span style="color: #008080;">?</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>x<span style="color: #000080;">&gt;</span>~x<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>~x<span style="color: #008080;">:</span>x<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;=</span>b<span style="color: #008080;">?</span>f5<span style="color: #008000;">&#40;</span>a,b,c<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>f5<span style="color: #008000;">&#40;</span>a,b,c<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">unsigned</span> f6<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> a,<span style="color: #0000ff;">unsigned</span> b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> f5<span style="color: #008000;">&#40;</span>a,b,a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">unsigned</span> a,b<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>a<span style="color: #000080;">&gt;&gt;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
                <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>f6<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>这个代码就很有趣了，仔细分析化简可以发现，这些函数都可以改成非递归形式，f1(a,b)实际上就是a+b，f2(a,b)就是a&lt;b?a:a-b，f3(a,b)是~(b==0?a:a%b)。</p><p>f4(a,b,c)有些麻烦，观察到f5调用f4时b,c是相等的，我最后把f4写成这个样子：( ( ( (b==0?0:b-gcd(a,b))+2  &#8211; ((min(a,b)-b)&amp;1) ) /2 )&amp;1)?~gcd(a,b):gcd(a,b)。其中gcd表示最大公约数。再往下看一些，f5中有一句(x&gt;~x) ?~x:x，这样看来分析f4返回数的符号就没有意义了，把f4(a,b,c)直接改成gcd(a,b)就行了。</p><p>知道了这些，程序已经可以写得比较短了：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">g<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">return</span> b<span style="color: #339933;">?</span>g<span style="color: #009900;">&#40;</span>b<span style="color: #339933;">,</span>a<span style="color: #339933;">%</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>a<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
f<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #339933;">,</span>c<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">return</span> c<span style="color: #339933;">?</span>f<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #339933;">,</span>c<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>g<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;=</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
main<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,&amp;</span>a<span style="color: #339933;">,&amp;</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>f<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #339933;">,</span>a<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>我还尝试着改更短一些：</p><div
class="wp_syntax"><div
class="code"><pre class="c" style="font-family:monospace;">g<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">return</span> b<span style="color: #339933;">?</span>g<span style="color: #009900;">&#40;</span>b<span style="color: #339933;">,</span>a<span style="color: #339933;">%</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>a<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
main<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d%d&quot;</span><span style="color: #339933;">,&amp;</span>a<span style="color: #339933;">,&amp;</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span>a<span style="color: #339933;">,</span>s<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">;</span>i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>s<span style="color: #339933;">+=</span>g<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;=</span>b<span style="color: #339933;">;</span>printf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span></pre></div></div><p>后面一个版本实际上处理完全平方数会给出错误结果，但是测试数据似乎比较弱，这行代码也被通过了。</p><h5>NP</h5><p>NP这道题就有一些算法竞赛的味道了，要在一个有向图里面找一个最小点集，使得其他点都有连到这个点集的边。由于不要求最优解，比赛也快结束了，我就决定用贪心法解决，每次找到一个点，这个点加到点集后，可以使剩下的没有连到这个点集的点最少。后来发现结果还不错 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><h5>TESTGEN</h5><p>这个题是要生成NP的测试数据，评分标准在比赛时也没有确定下来，但尽可能让别人的程序在自己的测试数据下比不过自己的程序总是正确的。在这里我生成大量的混杂的数据，却保证自己的贪心法一定可以得到最优解。最后结果也挺好，似乎还在官方的解体报告中出现了一下呢。</p><p>交完了所有题目之后，我又去尝试改进SHORTEN那一题，遗憾的是学校的网络状况不是很好，比赛快结束的那两个小时，先是超时，后来连接被重置，最后域名解析失败，只好郁郁而终了:sad:</p><p>由于NP和TESTGEN的分数衡量方法要后来才能确定，比赛结束后过了好几天才出了最终排名，自己排在了第14/283，还好的位置吧。很多人只是来玩一玩，做了一两题而已，所以正式的参加人数没有283这么多。</p><p>虽然比赛时间比较充裕，大概是三天多的时间，但自己写这些程序着实消耗了不少脑细胞，又赶上中间回校的十几个小时的火车和汽车，真的需要仔细体验一下睡眠的感觉了&#8230;</p><p>总的来说，我和多数参与者一样，觉得这个比赛办得很好，我特别欣赏出题人那些很有创意的鬼点子，不知道下一届的时候能不能再见到这样有创意的题目了。不管如何，让我们拭目以待吧。</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/tle-contest/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>朝花夕拾: 帝国时代变速器</title><link>http://lihdd.net/legacy-code-aoe-speed-adjuster/</link> <comments>http://lihdd.net/legacy-code-aoe-speed-adjuster/#comments</comments> <pubDate>Sat, 21 Feb 2009 22:53:14 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[Life]]></category> <category><![CDATA[download]]></category> <category><![CDATA[Legacy]]></category><guid
isPermaLink="false">http://lihdd.net/?p=9</guid> <description><![CDATA[最近应急写程序时用到了VB6，又见到了以前自己写的一些小程序， 有还像样的，有只给自己用的，也有一直没完成的…… 既然现在有空间了，独乐乐不如众乐乐，就把其中的一些看起来还好的，大家还有可能用到的程序拿出来分享吧 :-) 说起来好笑，以前自己觉得网络根本没必要存在嘛，什么东西买一张光盘就有了，上网很慢还不便宜。现在观点正好相反。 按字母排序，就看到了这个AOE Speed Adjuster。高中时只有一年的电脑课，但却比较无味，于是我们就在下面联机玩CS、帝国时代这样的游戏，但是帝国时代算上安装时间，在一节课总是玩不完，于是这样一个程序就应运而生了 当时对程序界面有这样的审美： 可执行程序可以在这里下载 程序很简单，如果需要源代码，可以和我联系 ;-)]]></description> <content:encoded><![CDATA[<p>最近应急写程序时用到了VB6，又见到了以前自己写的一些小程序，<br
/> 有还像样的，有只给自己用的，也有一直没完成的……</p><p>既然现在有空间了，独乐乐不如众乐乐，就把其中的一些看起来还好的，大家还有可能用到的程序拿出来分享吧 :-)<span
id="more-9"></span></p><p>说起来好笑，以前自己觉得网络根本没必要存在嘛，什么东西买一张光盘就有了，上网很慢还不便宜。现在观点正好相反。</p><p>按字母排序，就看到了这个AOE Speed Adjuster。高中时只有一年的电脑课，但却比较无味，于是我们就在下面联机玩CS、帝国时代这样的游戏，但是帝国时代算上安装时间，在一节课总是玩不完，于是这样一个程序就应运而生了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p><p>当时对程序界面有这样的审美：</p><div
id="attachment_10" class="wp-caption alignnone" style="width: 354px"><img
class="size-full wp-image-10" title="aoespeedadj_scrnshot" src="http://lihdd.net/wp-content/uploads/2009/02/aoespeedadj_scrnshot.png" alt="AOE Speed Adjust" width="344" height="280" /><p
class="wp-caption-text">AOE Speed Adjuster</p></div><p>可执行程序可以<a
title="AOE Speed Adjuster" href="http://lihdd.net/wp-content/uploads/2009/02/AOESpeedAdj.7z">在这里下载</a></p><p>程序很简单，如果需要源代码，可以<a
title="Contact me" href="http://lihdd.net/?page_id=7">和我联系</a> ;-)</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/legacy-code-aoe-speed-adjuster/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: lihdd.net @ 2012-05-19 14:11:47 -->
