<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ACM on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/acm/</link>
    <description>Recent content in ACM on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 26 Dec 2011 05:12:28 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/acm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Sicily 1031 Campus 解题报告.</title>
      <link>https://ykyi.net/?p=339/</link>
      <pubDate>Mon, 26 Dec 2011 05:12:28 +0000</pubDate>
      <guid>https://ykyi.net/?p=339/</guid>
      <description>&lt;div&gt;
  &lt;p&gt;
    &amp;nbsp;
  &lt;/p&gt;
  &lt;div&gt;
    1 原题中文大意;
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    Sicily 1031 Campus实际上就是求一个图中给出两点的最短路径的问题。
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    2 算法思想及解题用到的主要数据结构;
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    用 dijkstra 算法求给定两点的最短路径.
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    按路径长度递增次序产生最短路径算法： 　　把V分成两组： 　　（1）S：已求出最短路径的顶点的集合 　　（2）V-S=T：尚未确定最短路径的顶点集合 　　将T中顶点按最短路径递增的次序加入到S中， 　　保证：（1）从源点V0到S中各顶点的最短路径长度都不大于 　　从V0到T中任何顶点的最短路径长度 　　（2）每个顶点对应一个距离值 　　S中顶点：从V0到此顶点的最短路径长度 　　T中顶点：从V0到此顶点的只包括S中顶点作中间 　　顶点的最短路径长度 　　依据：可以证明V0到T中顶点Vk的最短路径，或是从V0到Vk的 　　直接路径的权值；或是从V0经S中顶点到Vk的路径权值之和。
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    3 &amp;nbsp;逐步求精算法描述
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    用邻接矩阵存放图.1. 初使时令 S={V0},T={其余顶点}，T中顶点对应的距离值 　　若存在&lt;V0,Vi&gt;，d(V0,Vi)为&lt;V0,Vi&gt;弧上的权值 　　若不存在&lt;V0,Vi&gt;，d(V0,Vi)为&amp;prop; 　　2. 从T中选取一个其距离值为最小的顶点W且不在S中，加入S 　　3. 对T中顶点的距离值进行修改：若加进W作中间顶点，从V0到Vi的 　　距离值比不加W的路径要短，则修改此距离值 　　重复上述步骤2、3，直到S中包含所有顶点，即S=T为止
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    3 程序注释清单 // 这份代码通不过sicily。有case错误。我实在找不到原因。
  &lt;/div&gt;
  &lt;div&gt;
    &amp;nbsp;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;pre class=&#34;brush:cpp&#34;&gt;#include &amp;lt;map&amp;gt;
&lt;p&gt;#include &amp;lt;vector&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;string&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;cstdio&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;cstring&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;cassert&amp;gt;&lt;/p&gt;
&lt;p&gt;#define INFINITE 0x0FFFFFFF&lt;/p&gt;
&lt;p&gt;// 这个类的函数几乎不做参数有效性的检查.&lt;/p&gt;
&lt;p&gt;class graph_t&lt;/p&gt;</description>
    </item>
    <item>
      <title>ACM 马周游解题报告</title>
      <link>https://ykyi.net/?p=223/</link>
      <pubDate>Fri, 25 Nov 2011 04:33:50 +0000</pubDate>
      <guid>https://ykyi.net/?p=223/</guid>
      <description>&lt;div&gt;
  &lt;center&gt;
    &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;
  &amp;amp;nbsp;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;amp;nbsp;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;amp;nbsp;
&amp;lt;/p&amp;gt;

&amp;lt;h3 style=&amp;quot;text-align: left; &amp;quot;&amp;gt;
  &amp;lt;span style=&amp;quot;font-size: 14px; &amp;quot;&amp;gt;简单的马周游问题&amp;lt;/span&amp;gt;
&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;
  &amp;amp;nbsp;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;amp;nbsp;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;/center&amp;gt; &amp;lt;/div&amp;gt; 
  
  &amp;lt;p&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/p&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Description&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;在一个5 * 6的棋盘中的某个位置有一只马，如果它走29步正好经过除起点外的其他位置各一次，这样一种走法则称马的周游路线，试设计一个算法，从给定的起点出发，找出它的一条周游路线。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;为了便于表示一个棋盘，我们按照从上到下，从左到右对棋盘的方格编号，如下所示：&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;1 &amp;amp;nbsp; &amp;amp;nbsp; 2 &amp;amp;nbsp; &amp;amp;nbsp; 3 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 4 &amp;amp;nbsp; &amp;amp;nbsp; 5 &amp;amp;nbsp; &amp;amp;nbsp; 6&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;7 &amp;amp;nbsp; &amp;amp;nbsp; 8 &amp;amp;nbsp; &amp;amp;nbsp; 9 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 10 &amp;amp;nbsp; &amp;amp;nbsp;11 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 12&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;13 &amp;amp;nbsp; &amp;amp;nbsp;14 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 15 &amp;amp;nbsp; &amp;amp;nbsp;16 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 17 &amp;amp;nbsp; &amp;amp;nbsp;18&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;19 &amp;amp;nbsp; &amp;amp;nbsp;20 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 21 &amp;amp;nbsp; &amp;amp;nbsp;22 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 23 &amp;amp;nbsp; &amp;amp;nbsp;24&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;25 &amp;amp;nbsp; &amp;amp;nbsp;26 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 27 &amp;amp;nbsp; &amp;amp;nbsp;28 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 29 &amp;amp;nbsp; &amp;amp;nbsp;30&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;马的走法是&amp;amp;ldquo;日&amp;amp;rdquo;字形路线，例如当马在位置15的时候，它可以到达2、4、7、11、19、23、26和28。但是规定马是不能跳出棋盘外的，例如从位置1只能到达9和14。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Input&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;输入有若干行。每行一个整数N(1&amp;lt;=N&amp;lt;=30)，表示马的起点。最后一行用-1表示结束，不用处理。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Output&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;对输入的每一个起点，求一条周游线路。对应地输出一行，有30个整数，从起点开始按顺序给出马每次经过的棋盘方格的编号。相邻的数字用一个空格分开。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Sample Input&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;-1&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Sample Output&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;注意：如果起点和输入给定的不同，重复多次经过同一方格或者有的方格没有被经过，都会被认为是错误的。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;（1）原题中文大意&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;中国象棋的马按照象棋的规则在5 x 6 的棋盘上跑30步跑完所有的格子。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;（2）算法思想及解题用到的主要数据结构&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;从每一个点往下走第二步，会有几点有效的行走位置。 把当前位置记在栈里面，以深度优先的方式进入下一个有效位置。如果下一个有效位置在之前已经走过，则从栈顶弹出上一位置，恢复到调出的位置后尝试未走过的有效位置。利用函数调用时会压栈的特别，用函数递归调用即可解决问题。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;（3）详细解题思路&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;1. 先初始化一张表。这张表记下了棋盘上所有的30个位置的下一步可走的有效位置.&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;2. 写一个一般的递归调用自己的函数，表示马在走第几步时到了哪个位置，然后尝试走余下的所有可走位置。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;3. 递归函数有两个退出条件。要么下一个要尝试的点已经走过了，要么走到了最后一步，即得解！&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;（4）逐步求精算法描述&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;用一个数组记下来经过的点。&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;（5）程序注释清单&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;amp;nbsp;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;div&amp;gt;
    &amp;lt;pre class=&amp;quot;brush:cpp&amp;quot;&amp;gt;#include &amp;amp;lt;iostream&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;#include &amp;lt;cstring&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;vector&amp;gt;&lt;/p&gt;
&lt;p&gt;using namespace std;&lt;/p&gt;
&lt;p&gt;const static char row_num = 5;   // 5行&lt;/p&gt;
&lt;p&gt;const static char column_num = 6;  // 6列&lt;/p&gt;
&lt;p&gt;// 这个全局数组在初始化后会记下每30个有效位置的下一步可走位置.&lt;/p&gt;
&lt;p&gt;// elocution[x][0]记个数。最多8个有效可走位置。&lt;/p&gt;
&lt;p&gt;char elocution[30][9];&lt;/p&gt;
&lt;p&gt;struct coordinate  // 坐标.&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;char _x;  // start from zero.&lt;/p&gt;
&lt;p&gt;char _y;&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;// 坐标转序号的函数。&lt;/p&gt;
&lt;p&gt;char coordinate2serial_num(coordinate co)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;char num = co._x * column_num + co._y + 1;&lt;/p&gt;
&lt;p&gt;return num;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// 序号转坐标的函数。&lt;/p&gt;
&lt;p&gt;coordinate serial_num2coordinate(char sn)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;coordinate co;&lt;/p&gt;
&lt;p&gt;co._x = (sn - 1) / column_num;&lt;/p&gt;
&lt;p&gt;co._y = sn - co._x * column_num - 1;&lt;/p&gt;
&lt;p&gt;return co;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// 增量数组.&lt;/p&gt;
&lt;p&gt;char increments[8][2] =&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;1, -2, 2, -1, 2, 1, 1, 2,&lt;/p&gt;
&lt;p&gt;-1, 2, -2, 1, -2, -1, -1, -2&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;// 得用增量数组来计算每一个位置的下一步有效位置。记到steps里面.&lt;/p&gt;
&lt;p&gt;void next_step(char pos, char steps[])&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;char valid_count = 0;&lt;/p&gt;
&lt;p&gt;coordinate co = serial_num2coordinate(pos);&lt;/p&gt;
&lt;p&gt;coordinate tmp;&lt;/p&gt;
&lt;p&gt;char serial_num;&lt;/p&gt;
&lt;p&gt;for ( int i = 0; i &amp;lt; 8; i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;tmp._x = co._x + increments[i][0];&lt;/p&gt;
&lt;p&gt;tmp._y = co._y + increments[i][1];&lt;/p&gt;
&lt;p&gt;if ( tmp._x &amp;lt; 0 || tmp._x &amp;gt; 4 || tmp._y &amp;lt; 0 || tmp._y &amp;gt; 5 )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;continue;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;serial_num = coordinate2serial_num(tmp);&lt;/p&gt;
&lt;p&gt;if ( serial_num &amp;gt;= 1 &amp;amp;&amp;amp; serial_num &amp;lt;= 30 )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;valid_count++;&lt;/p&gt;
&lt;p&gt;steps[valid_count] = serial_num;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;cerr &amp;lt;&amp;lt; &amp;ldquo;Not expected to reach here.\n&amp;rdquo;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;steps[0] = valid_count;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// 初始化记载所有点的下一步可走点的全局表。&lt;/p&gt;
&lt;p&gt;void init_elocution()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;for ( int i = 1; i &amp;lt;= 30; i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;next_step(i, elocution[i-1]);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;char track[30];   // 记走过的路径.&lt;/p&gt;
&lt;p&gt;bool quit_run_horse;&lt;/p&gt;
&lt;p&gt;// 上文提高的递归函用函数.&lt;/p&gt;
&lt;p&gt;void run_horse(char start_pos, char step_count)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;if ( quit_run_horse ) // 用来快速退出深嵌套递归调用函数.&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;return;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;for ( int i = 0; i &amp;lt; step_count; i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;// 已?经-经-过y这a点?了?.&lt;/p&gt;
&lt;p&gt;if ( track[i] == start_pos )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;return;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;track[step_count] = start_pos; // 记下新走过的位置&lt;/p&gt;
&lt;p&gt;if ( step_count == 29 )  // 最后一步则打印出结果。&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;for ( int i = 0; i &amp;lt; sizeof(track); i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;cout &amp;lt;&amp;lt; (int)track[i];&lt;/p&gt;
&lt;p&gt;if ( i + 1 != sizeof(track) )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;cout &amp;lt;&amp;lt; &amp;quot; &amp;ldquo;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;cout &amp;lt;&amp;lt; endl;&lt;/p&gt;
&lt;p&gt;quit_run_horse = true;&lt;/p&gt;
&lt;p&gt;return;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;for ( int i = 0; i &amp;lt; elocution[start_pos-1][0]; i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;run_horse(elocution[start_pos-1][i+1], step_count+1);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;int main(int argc, char* argv[])&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;init_elocution();&lt;/p&gt;
&lt;p&gt;int pos;&lt;/p&gt;
&lt;p&gt;vector&amp;lt;int&amp;gt; vec;&lt;/p&gt;
&lt;p&gt;while(true)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;cin &amp;gt;&amp;gt; pos;&lt;/p&gt;
&lt;p&gt;if (pos==-1)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;break;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;vec.push_back(pos);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;for ( int i = 0; i &amp;lt; vec.size(); i++ )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;quit_run_horse = false;&lt;/p&gt;
&lt;p&gt;run_horse(vec[i], 0);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;return 0;&lt;/p&gt;
&lt;p&gt;}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;
  &amp;nbsp;
&lt;/p&gt;
&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
