<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_hoodlum1980 [ 发发 ] 的技术博客</title><subtitle type="text">-- C, C++, C#, 图像处理, Windows Mobile; (I LOVE ZJU)</subtitle><id>http://feed.cnblogs.com/blog/u/25773/rss</id><updated>2012-05-28T08:48:23Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/25773/rss"/><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521500.html</id><title type="text">C/C++版实现（Base64, UrlEncode等）</title><summary type="text">本文主要给出 C/C++（实质是C）语言版本的以下功能实现，包括 Base64 编码，解码，UrlEncode/UrlDecode，获取网卡物理地址，用 SMTP 协议发送邮件，发送 POST 请求等。</summary><published>2012-05-28T08:27:00Z</published><updated>2012-05-28T08:27:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521500.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521500.html"/><content type="html">&lt;p&gt;【原创性声明】：本文无实质性创新性内容，性质属于技术总结，内容是基于已有知识或定义的代码实现。文中的代码是我根据其他代码或者网络上的资料，写出的自己的版本。因为网络上的代码 C/C++ 版本的较少，或者本身不一定是最合适最容易使用的。所以我写的代码基本是以 C 语言和 C 字符串处理为主的，因此它也可以直接在 C++ 的项目中使用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（1）Base64 编码。Base64 编码是把每 3 个字节转换成 4 个ascii 字符（根据字符表映射）。把文本编码后，对人来说难以直接阅读。结尾不足时可能有一到两个 "=" 字符的补齐。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('bb6124fd-4f73-406a-aa01-0ccba90844d6')"&gt;&lt;div id="cnblogs_code_open_bb6124fd-4f73-406a-aa01-0ccba90844d6" class="cnblogs_code_hide"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;以下是 Base64.h 的内容:&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;size_t Base64_Decode(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSrc, size_t srclen);&lt;br/&gt;size_t Base64_Encode(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSrc, size_t srclen);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;以下是 Base64.cpp 的内容:&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;BYTE Decode_GetByte(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; c);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; Encode_GetChar(BYTE num);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;===================================&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    Base64 解码&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;===================================&lt;/span&gt;&lt;br/&gt;BYTE Decode_GetByte(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; c)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;62&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;63&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (BYTE)(c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;52&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;64&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (BYTE)(c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (BYTE)(c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;64&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;解码&lt;/span&gt;&lt;br/&gt;size_t Base64_Decode(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSrc, size_t srclen)&lt;br/&gt;{&lt;br/&gt;    BYTE input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    size_t i, index &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; srclen; i += &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;byte[0]&lt;/span&gt;&lt;br/&gt;        input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] =&lt;span style="color: #000000;"&gt; Decode_GetByte(pSrc[i]);&lt;br/&gt;        input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = Decode_GetByte(pSrc[i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        pDest[index&lt;/span&gt;++] = (input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;) + (input[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;byte[1]&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[i + &lt;span style="color: #800080;"&gt;2&lt;/span&gt;] != &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = Decode_GetByte(pSrc[i + &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            pDest[index&lt;/span&gt;++] = ((input[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x0f&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) + (input[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;byte[2]&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[i + &lt;span style="color: #800080;"&gt;3&lt;/span&gt;] != &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = Decode_GetByte(pSrc[i + &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            pDest[index&lt;/span&gt;++] = ((input[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x03&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;) + (input[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }            &lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator&lt;/span&gt;&lt;br/&gt;    pDest[index] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; index;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;===================================&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    Base64 编码&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;===================================&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; Encode_GetChar(BYTE num)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abcdefghijklmnopqrstuvwxyz&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0123456789&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;+/=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;[num];&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;编码&lt;/span&gt;&lt;br/&gt;size_t Base64_Encode(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSrc, size_t srclen)&lt;br/&gt;{&lt;br/&gt;    BYTE input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;], output[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    size_t i, index_src &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, index_dest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; srclen; i += &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;char [0]&lt;/span&gt;&lt;br/&gt;        input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = pSrc[index_src++&lt;span style="color: #000000;"&gt;];&lt;br/&gt;        output[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = (BYTE)(input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;char [1]&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index_src &amp;lt;&lt;span style="color: #000000;"&gt; srclen)&lt;br/&gt;        {&lt;br/&gt;            input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = pSrc[index_src++&lt;span style="color: #000000;"&gt;];&lt;br/&gt;            output[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = (BYTE)(((input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x03&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) + (input[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            output[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = (BYTE)((input[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x03&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;char [2]&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index_src &amp;lt;&lt;span style="color: #000000;"&gt; srclen)&lt;br/&gt;        {&lt;br/&gt;            input[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = pSrc[index_src++&lt;span style="color: #000000;"&gt;];&lt;br/&gt;            output[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = (BYTE)(((input[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x0f&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;) + (input[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            output[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = (BYTE)((input[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x0f&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            pDest[index_dest&lt;/span&gt;++] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;char [3]&lt;/span&gt;&lt;br/&gt;        output[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = (BYTE)(input[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;amp; &lt;span style="color: #800080;"&gt;0x3f&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        pDest[index_dest&lt;/span&gt;++] = Encode_GetChar(output[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator&lt;/span&gt;&lt;br/&gt;    pDest[index_dest] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; index_dest;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（2）UrlEncode （百分号编码）。方法是把输入的字符串先用 UTF-8 编码，然后把基本字符以外的字节用百分号加16进制的形式编码。UrlEncode 的最后一个参数含义是，编码结果中的16进制字符是否采用大写字母表示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('0eb05d1b-3eae-42be-81f0-435b8463827a')"&gt;&lt;div id="cnblogs_code_open_0eb05d1b-3eae-42be-81f0-435b8463827a" class="cnblogs_code_hide"&gt;BOOL UrlEncode(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szSrc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBuf, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbBufLen, BOOL bUpperCase);&lt;br/&gt;BOOL UrlDecode(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szSrc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBuf, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbBufLen);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;百分号编码&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://zh.wikipedia.org/zh-cn/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;BOOL UrlEncode(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szSrc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBuf, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbBufLen, BOOL bUpperCase)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(szSrc == NULL || pBuf == NULL || cbBufLen &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    size_t len_ascii &lt;/span&gt;=&lt;span style="color: #000000;"&gt; strlen(szSrc);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(len_ascii == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        pBuf[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;先转换到UTF-8&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; baseChar = bUpperCase ? &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; : &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cchWideChar = MultiByteToWideChar(CP_ACP, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, szSrc, len_ascii, NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    LPWSTR pUnicode &lt;/span&gt;= (LPWSTR)malloc((cchWideChar + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pUnicode ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    MultiByteToWideChar(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, szSrc, len_ascii, pUnicode, cchWideChar + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cbUTF8 = WideCharToMultiByte(CP_UTF8, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, pUnicode, cchWideChar, NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, NULL, NULL);&lt;br/&gt;    LPSTR pUTF8 &lt;/span&gt;= (LPSTR)malloc((cbUTF8 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CHAR));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pUTF8 ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;    {&lt;br/&gt;        free(pUnicode);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;    WideCharToMultiByte(CP_UTF8, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, pUnicode, cchWideChar, pUTF8, cbUTF8 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, NULL, NULL);&lt;br/&gt;    pUTF8[cbUTF8] &lt;/span&gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;    unsigned &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; c;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cbDest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;累加&lt;/span&gt;&lt;br/&gt;    unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pSrc = (unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;)pUTF8;&lt;br/&gt;    unsigned &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest = (unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;)pBuf;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*pSrc &amp;amp;&amp;amp; cbDest &amp;lt; cbBufLen - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        c &lt;/span&gt;= *&lt;span style="color: #000000;"&gt;pSrc;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(isalpha(c) || isdigit(c) || c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; || c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; || c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;~&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;*pDest =&lt;span style="color: #000000;"&gt; c;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pDest;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;cbDest;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;*pDest = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pDest;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;cbDest;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;检查缓冲区大小是否够用？&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(cbDest + &lt;span style="color: #800080;"&gt;3&lt;/span&gt; &amp;gt; cbBufLen - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            pDest[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            pDest[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = (c &amp;gt;= &lt;span style="color: #800080;"&gt;0xA0&lt;/span&gt;) ? ((c &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) - &lt;span style="color: #800080;"&gt;10&lt;/span&gt; + baseChar) : ((c &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            pDest[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = ((c &amp;amp; &lt;span style="color: #800080;"&gt;0xF&lt;/span&gt;) &amp;gt;= &lt;span style="color: #800080;"&gt;0xA&lt;/span&gt;)? ((c &amp;amp; &lt;span style="color: #800080;"&gt;0xF&lt;/span&gt;) - &lt;span style="color: #800080;"&gt;10&lt;/span&gt; + baseChar) : ((c &amp;amp; &lt;span style="color: #800080;"&gt;0xF&lt;/span&gt;) + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            pDest &lt;/span&gt;+= &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            cbDest &lt;/span&gt;+= &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pSrc;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator&lt;/span&gt;&lt;br/&gt;    *pDest = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    free(pUnicode);&lt;br/&gt;    free(pUTF8);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;解码后是utf-8编码&lt;/span&gt;&lt;br/&gt;BOOL UrlDecode(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szSrc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBuf, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbBufLen)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(szSrc == NULL || pBuf == NULL || cbBufLen &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    size_t len_ascii &lt;/span&gt;=&lt;span style="color: #000000;"&gt; strlen(szSrc);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(len_ascii == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        pBuf[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pUTF8 = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*)malloc(len_ascii + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pUTF8 ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cbDest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;累加&lt;/span&gt;&lt;br/&gt;    unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pSrc = (unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;)szSrc;&lt;br/&gt;    unsigned &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *pDest = (unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;)pUTF8;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*&lt;span style="color: #000000;"&gt;pSrc)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*pSrc == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;*pDest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;高位&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;F&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;*pDest += (pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;) * &lt;span style="color: #800080;"&gt;0x10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;f&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;*pDest += (pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;) * &lt;span style="color: #800080;"&gt;0x10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;                *pDest += (pSrc[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) * &lt;span style="color: #800080;"&gt;0x10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;低位&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;F&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;*pDest += (pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;f&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;*pDest += (pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;                *pDest += (pSrc[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;            pSrc &lt;/span&gt;+= &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*pSrc == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;*pDest = &lt;span style="color: #800000;"&gt;'&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pSrc;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;*pDest = *&lt;span style="color: #000000;"&gt;pSrc;&lt;br/&gt;            &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pSrc;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;++&lt;span style="color: #000000;"&gt;pDest;&lt;br/&gt;        &lt;/span&gt;++&lt;span style="color: #000000;"&gt;cbDest;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator&lt;/span&gt;&lt;br/&gt;    *pDest = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;++&lt;span style="color: #000000;"&gt;cbDest;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cchWideChar = MultiByteToWideChar(CP_UTF8, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, (LPCSTR)pUTF8, cbDest, NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    LPWSTR pUnicode &lt;/span&gt;= (LPWSTR)malloc(cchWideChar * &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pUnicode ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;    {&lt;br/&gt;        free(pUTF8);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;    MultiByteToWideChar(CP_UTF8, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (LPCSTR)pUTF8, cbDest, pUnicode, cchWideChar);&lt;br/&gt;    WideCharToMultiByte(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pUnicode, cchWideChar, pBuf, cbBufLen, NULL, NULL);&lt;br/&gt;    free(pUTF8);&lt;br/&gt;    free(pUnicode);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（3）获取本机 IP 地址和网卡物理地址。可能有多个网络适配器，但这里只是给出第一个适配器的结果。根据网络资料，获取网卡物理地址有多种方法。已知 IP 地址获取其物理地址可以使用 SendARP 方法。但对于本机来说，可以直接用 GetAdaptersAddresses 更适合，其返回结果为链表（list）形式。这里对 IP 默认为 IPv4（4个字节），网卡物理地址通常为 6 个字节。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('a68c3a3f-99dc-4206-880d-654eda5e1a40')"&gt;&lt;div id="cnblogs_code_open_a68c3a3f-99dc-4206-880d-654eda5e1a40" class="cnblogs_code_hide"&gt;#include &amp;lt;Winsock2.h&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;#include &lt;/span&gt;&amp;lt;IPHlpApi.h&amp;gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;for GetAdaptersAddresses&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取本机的IP地址&lt;/span&gt;&lt;br/&gt;BOOL GetIPAddress(unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt; buffer)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; bRet;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; hostname[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    WSADATA wsadata; &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; hostent *&lt;span style="color: #000000;"&gt;pHost;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; in_addr *&lt;span style="color: #000000;"&gt;pAddr;&lt;br/&gt;    WORD dwVersionRequested &lt;/span&gt;= MAKEWORD( &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;    &lt;br/&gt;    bRet&lt;/span&gt;= WSAStartup(dwVersionRequested, &amp;amp;&lt;span style="color: #000000;"&gt;wsadata);&lt;br/&gt;    bRet&lt;/span&gt;= gethostname(hostname, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hostname));&lt;br/&gt;    pHost &lt;/span&gt;=&lt;span style="color: #000000;"&gt; gethostbyname(hostname);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pHost != NULL &amp;amp;&amp;amp; pHost-&amp;gt;h_addr_list[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] !=&lt;span style="color: #000000;"&gt; NULL) &lt;br/&gt;    {&lt;br/&gt;        pAddr &lt;/span&gt;= (&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; in_addr*)(pHost-&amp;gt;h_addr_list[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        buffer[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = pAddr-&amp;gt;&lt;span style="color: #000000;"&gt;s_net;&lt;br/&gt;        buffer[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = pAddr-&amp;gt;&lt;span style="color: #000000;"&gt;s_host;&lt;br/&gt;        buffer[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = pAddr-&amp;gt;&lt;span style="color: #000000;"&gt;s_lh;&lt;br/&gt;        buffer[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = pAddr-&amp;gt;&lt;span style="color: #000000;"&gt;s_impno;&lt;br/&gt;        bRet &lt;/span&gt;=&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;取不到IP地址，则赋值默认值 255.255.255.255&lt;/span&gt;&lt;br/&gt;        memset(buffer, &lt;span style="color: #800080;"&gt;0xff&lt;/span&gt;, &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        bRet &lt;/span&gt;=&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;    WSACleanup();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; bRet;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;参数pMacAddr应该是8个字节的数组&lt;/span&gt;&lt;br/&gt;BOOL GetMacAddress(unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt; pMacAddr)&lt;br/&gt;{&lt;br/&gt;    DWORD nRet;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;只查询物理地址&lt;/span&gt;&lt;br/&gt;    DWORD nFlags =&lt;span style="color: #000000;"&gt; GAA_FLAG_SKIP_UNICAST &lt;br/&gt;        &lt;/span&gt;|&lt;span style="color: #000000;"&gt; GAA_FLAG_SKIP_ANYCAST&lt;br/&gt;        &lt;/span&gt;|&lt;span style="color: #000000;"&gt; GAA_FLAG_SKIP_FRIENDLY_NAME&lt;br/&gt;        &lt;/span&gt;|&lt;span style="color: #000000;"&gt; GAA_FLAG_SKIP_MULTICAST&lt;br/&gt;        &lt;/span&gt;|&lt;span style="color: #000000;"&gt; GAA_FLAG_SKIP_DNS_SERVER;&lt;br/&gt;&lt;br/&gt;    ULONG bufLen &lt;/span&gt;= &lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    PIP_ADAPTER_ADDRESSES pAdapterAddr &lt;/span&gt;=&lt;span style="color: #000000;"&gt; (PIP_ADAPTER_ADDRESSES)malloc(bufLen);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pAdapterAddr ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;AF_INET: return only IPv4 addresses.&lt;/span&gt;&lt;br/&gt;    nRet = GetAdaptersAddresses(AF_INET, nFlags,  NULL, pAdapterAddr, &amp;amp;&lt;span style="color: #000000;"&gt;bufLen);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nRet ==&lt;span style="color: #000000;"&gt; ERROR_BUFFER_OVERFLOW)&lt;br/&gt;    {&lt;br/&gt;        pAdapterAddr &lt;/span&gt;=&lt;span style="color: #000000;"&gt; (PIP_ADAPTER_ADDRESSES)realloc(pAdapterAddr, bufLen);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pAdapterAddr ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;        nRet &lt;/span&gt;= GetAdaptersAddresses(AF_INET, nFlags,  NULL, pAdapterAddr, &amp;amp;&lt;span style="color: #000000;"&gt;bufLen);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nRet ==&lt;span style="color: #000000;"&gt; ERROR_SUCCESS)&lt;br/&gt;    {&lt;br/&gt;        memcpy(pMacAddr, &lt;/span&gt;&amp;amp;pAdapterAddr-&amp;gt;PhysicalAddress, pAdapterAddr-&amp;gt;&lt;span style="color: #000000;"&gt;PhysicalAddressLength);&lt;br/&gt;        free(pAdapterAddr);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ff-ff-ff-ff-ff-ff: 表示获取失败（未知）&lt;/span&gt;&lt;br/&gt;        memset(pMacAddr, &lt;span style="color: #800080;"&gt;0xff&lt;/span&gt;, &lt;span style="color: #800080;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        free(pAdapterAddr);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（4）使用 SMTP 发送邮件。本文是参考看雪论坛上某文章中的代码。如果发送中文，应该在传输时，指定文本使用的编码，以防止接收端解释成乱码。以下代码引用了（1）中的 Base64 编码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('5fa4b599-9700-432f-b78a-477e0f241b69')"&gt;&lt;div id="cnblogs_code_open_5fa4b599-9700-432f-b78a-477e0f241b69" class="cnblogs_code_hide"&gt;#include &amp;lt;Winsock2.h&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;typedef &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; _SMTPINFO&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Server[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Port;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; UserName[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Password[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; From[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; To[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Subject[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Msg[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;} SMTPINFO, &lt;/span&gt;*&lt;span style="color: #000000;"&gt;LPSMTPINFO;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL Talk(SOCKET sockid, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *szOkCode, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSend);&lt;br/&gt;BOOL SendMail(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; LPSMTPINFO pInfo);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;szOkCode: 是前一条命令成功时，预期的服务器的返回码&lt;/span&gt;&lt;br/&gt;BOOL Talk(SOCKET sockid, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *szOkCode, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #000000;"&gt;pSend)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; buflen = &lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; buf[buflen];&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;接收返回信息&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (recv(sockid, buf, buflen, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) ==&lt;span style="color: #000000;"&gt; SOCKET_ERROR)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (strncmp(buf, szOkCode, strlen(szOkCode)) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;发送命令&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (lstrlen(pSend) &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        WSABUF DataBuf;&lt;br/&gt;        DataBuf.len &lt;/span&gt;=&lt;span style="color: #000000;"&gt; lstrlen(pSend);&lt;br/&gt;        DataBuf.buf &lt;/span&gt;=&lt;span style="color: #000000;"&gt; pSend;&lt;br/&gt;&lt;br/&gt;        DWORD dwS;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(WSASend(sockid, &amp;amp;DataBuf, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &amp;amp;dwS, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;BOOL SendMail(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; LPSMTPINFO pInfo)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; buf[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;准备网络连接&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    WSADATA wsadata;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(WSAStartup(MAKEWORD(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;), &amp;amp;wsadata) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建套接字&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    SOCKET sockid;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((sockid = socket(AF_INET, SOCK_STREAM, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)) ==&lt;span style="color: #000000;"&gt; INVALID_SOCKET)&lt;br/&gt;    {&lt;br/&gt;        WSACleanup();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到smtp服务器ip&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; hostent *phostent = gethostbyname(pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;Server);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; sockaddr_in addr;&lt;br/&gt;&lt;br/&gt;    CopyMemory(&lt;/span&gt;&amp;amp;&lt;span style="color: #000000;"&gt;addr.sin_addr.S_un.S_addr,&lt;br/&gt;        phostent&lt;/span&gt;-&amp;gt;h_addr_list[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(addr.sin_addr.S_un.S_addr));&lt;br/&gt;&lt;br/&gt;    addr.sin_family &lt;/span&gt;=&lt;span style="color: #000000;"&gt; AF_INET;&lt;br/&gt;    addr.sin_port &lt;/span&gt;= htons(pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;Port);&lt;br/&gt;    ZeroMemory(&lt;/span&gt;&amp;amp;addr.sin_zero, &lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;连接服务器&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(connect(sockid, (&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; sockaddr *)&amp;amp;addr, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; sockaddr_in)) ==&lt;span style="color: #000000;"&gt; SOCKET_ERROR)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;EHLO 是对 HELO 的扩充命令。&lt;/span&gt;&lt;br/&gt;    strcpy(buf, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EHLO hoodlum1980\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;220&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    strcpy(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AUTH LOGIN\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;250&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    size_t userlen &lt;/span&gt;= lstrlen(pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;UserName);&lt;br/&gt;    size_t passlen &lt;/span&gt;= lstrlen(pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;Password);&lt;br/&gt;    Base64_Encode(buf, pInfo&lt;/span&gt;-&amp;gt;&lt;span style="color: #000000;"&gt;UserName, userlen);&lt;br/&gt;    strcat(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;334&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    Base64_Encode(buf, pInfo&lt;/span&gt;-&amp;gt;&lt;span style="color: #000000;"&gt;Password, passlen);&lt;br/&gt;    strcat(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;334&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ZeroMemory(buf, buflen);&lt;/span&gt;&lt;br/&gt;    wsprintf(buf, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MAIL FROM:&amp;lt;%s&amp;gt;\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;From);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;235&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    wsprintf(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;RCPT TO:&amp;lt;%s&amp;gt;\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;To);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;250&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    strcpy(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DATA\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;250&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; szContent[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    Base64_Encode(szContent, pInfo&lt;/span&gt;-&amp;gt;Msg, strlen(pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;Msg));&lt;br/&gt;    wsprintf(buf, &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MIME-Version:1.0\r\nContent-Type:text/plain; charset=gb2312\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Transfer-Encoding:base64\r\nContent-Language:zh-cn\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TO: %s\r\nFROM: %s\r\nSUBJECT: %s\r\n\r\n%s\r\n.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        pInfo&lt;/span&gt;-&amp;gt;To, pInfo-&amp;gt;From, pInfo-&amp;gt;&lt;span style="color: #000000;"&gt;Subject,    szContent);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;354&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    strcpy(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;QUIT\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;250&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;&lt;br/&gt;    strcpy(buf, &lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!Talk(sockid, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;221&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buf))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt; STOP;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        closesocket(sockid);&lt;br/&gt;        WSACleanup();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;STOP:&lt;br/&gt;    closesocket(sockid);&lt;br/&gt;    WSACleanup();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 使用范例: &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;SMTPINFO info;&lt;br/&gt;strcpy(info.Server,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;smtp.***.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;info.Port &lt;/span&gt;= &lt;span style="color: #800080;"&gt;25&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;strcpy(info.UserName,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;XXXXX@***.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;strcpy(info.Password,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*****&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;strcpy(info.From, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;XXXXX@***.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;strcpy(info.To, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;YYYYY@YYY.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;strcpy(info.Subject, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;邮件标题&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;strcpy(info.Msg, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;邮件内容。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;SendMail(&lt;/span&gt;&amp;amp;info);&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（5）以 Post 形式发送 HTTP 请求。如果使用 C# 则可以使用 HttpRequest。由于是测试版本，以下代码在读取服务器响应时假设服务器的响应是短文本，因此没有判断服务器的响应是否已全部读取，并不是非常完善。在实际应用中应完善后使用。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('107cf2e9-a9fb-4688-a924-2519df4448f3')"&gt;&lt;div id="cnblogs_code_open_107cf2e9-a9fb-4688-a924-2519df4448f3" class="cnblogs_code_hide"&gt;#include &amp;lt;Wininet.h&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;BOOL SendHttpPost()&lt;br/&gt;{&lt;br/&gt;    HINTERNET hInternet &lt;/span&gt;= InternetOpen(_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;HttpPostTest&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;        INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(hInternet ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;&lt;br/&gt;    HINTERNET hConnect &lt;/span&gt;=&lt;span style="color: #000000;"&gt; InternetConnect(hInternet,&lt;br/&gt;        _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;www.xxx.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;        INTERNET_DEFAULT_HTTP_PORT,&lt;br/&gt;        NULL, &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;user&lt;/span&gt;&lt;br/&gt;        NULL, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;password&lt;/span&gt;&lt;br/&gt;        INTERNET_SERVICE_HTTP, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(hConnect ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;    {&lt;br/&gt;        InternetCloseHandle(hInternet);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    LPCTSTR szTypes[] &lt;/span&gt;= { _T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*/*&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), NULL };&lt;br/&gt;    TCHAR szData[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;], szResponse[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    TCHAR szContent[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;], szTemp[&lt;span style="color: #800080;"&gt;128&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;全英文的ascii字符集是UTF-8的子集，所以下面的字符串也可以看着是 UTF-8 编码的。&lt;/span&gt;&lt;br/&gt;    _tcscpy(szContent, _T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;user=xxx&amp;amp;password=xxx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;&lt;br/&gt;    DWORD dwBytesAvailable &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, dwBytesRead = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;br/&gt;    HINTERNET hRequest &lt;/span&gt;=&lt;span style="color: #000000;"&gt; HttpOpenRequest(hConnect,&lt;br/&gt;        _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;POST&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;        _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/xxx/xxx.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;        NULL, &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;version: "HTTP/1.1"&lt;/span&gt;&lt;br/&gt;        _T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.xxx.com/xxx/xxx.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;referer&lt;/span&gt;&lt;br/&gt;        szTypes, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;types&lt;/span&gt;&lt;br/&gt;        INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_RELOAD, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(hRequest ==&lt;span style="color: #000000;"&gt; NULL)&lt;br/&gt;    {&lt;br/&gt;        InternetCloseHandle(hConnect);&lt;br/&gt;        InternetCloseHandle(hInternet);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    BOOL bSuccess;&lt;br/&gt;    &lt;br/&gt;    TCHAR headers[&lt;/span&gt;&lt;span style="color: #800080;"&gt;512&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    _stprintf(headers, _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Length: %ld\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), _tcslen(szContent));&lt;br/&gt;    _tcscat(headers, &lt;br/&gt;        _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Type: application/x-www-form-urlencoded\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        _T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xxx: yyy\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        );&lt;br/&gt;&lt;br/&gt;    bSuccess &lt;/span&gt;=&lt;span style="color: #000000;"&gt; HttpSendRequest(hRequest,&lt;br/&gt;        headers, &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;additional header&lt;/span&gt;&lt;br/&gt;        _tcslen(headers), &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;headersLength&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        szContent,&lt;br/&gt;        _tcslen(szContent));&lt;br/&gt;&lt;br/&gt;    TCHAR szBuffer[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    DWORD bufLen &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(szBuffer);&lt;br/&gt;    DWORD dwIndex &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(bSuccess)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;查询服务器返回的headers信息，内含传输内容使用的编码。&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, &lt;br/&gt;            szBuffer,&lt;br/&gt;            &lt;/span&gt;&amp;amp;bufLen, &amp;amp;&lt;span style="color: #000000;"&gt;dwIndex);&lt;br/&gt;&lt;br/&gt;        InternetQueryDataAvailable(hRequest, &lt;/span&gt;&amp;amp;dwBytesAvailable, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        bSuccess &lt;/span&gt;= InternetReadFile(hRequest, szResponse, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(szResponse), &amp;amp;&lt;span style="color: #000000;"&gt;dwBytesRead);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = MultiByteToWideChar(CP_UTF8, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, szResponse, dwBytesRead, szDataUnicode, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(szDataUnicode)/&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(szDataUnicode[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]));&lt;br/&gt;        count &lt;/span&gt;= WideCharToMultiByte(CP_ACP, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, szDataUnicode, count, szData, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(szData)/&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(szData[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]), NULL, NULL);&lt;br/&gt;        szData[count] &lt;/span&gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    InternetCloseHandle(hRequest);&lt;br/&gt;    InternetCloseHandle(hConnect);&lt;br/&gt;    InternetCloseHandle(hInternet);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; bSuccess;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以下是 java 版本的类似代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('2b4f3ce3-e87f-4042-8509-74324be8403c')"&gt;&lt;div id="cnblogs_code_open_2b4f3ce3-e87f-4042-8509-74324be8403c" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; String SendRequest() &lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;发送post请求获取签名&lt;/span&gt;&lt;br/&gt;    String postData = "user=%s&amp;amp;password=%s"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] postBytes =&lt;span style="color: #000000;"&gt; postData.getBytes();&lt;br/&gt;    URL url &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; URL("http://www.xxx.com/xxx/xxx.aspx"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    HttpURLConnection connection &lt;/span&gt;=&lt;span style="color: #000000;"&gt; (HttpURLConnection)url.openConnection();&lt;br/&gt;    connection.setDoOutput(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.setDoInput(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.setRequestMethod(&lt;/span&gt;"POST"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.setRequestProperty(&lt;/span&gt;"Content-Length"&lt;span style="color: #000000;"&gt;, String.valueOf(postBytes.length));&lt;br/&gt;    connection.setRequestProperty(&lt;/span&gt;"Content-Type", "application/x-www-form-urlencoded"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.setRequestProperty(&lt;/span&gt;"xxx", "yyy"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.setUseCaches(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    connection.connect();&lt;br/&gt;    &lt;br/&gt;    DataOutputStream out &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataOutputStream(connection.getOutputStream());&lt;br/&gt;    out.write(postBytes);&lt;br/&gt;    out.flush();&lt;br/&gt;    out.close(); &lt;br/&gt;    &lt;br/&gt;    StringBuffer buf &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuffer(960&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; responseCode =&lt;span style="color: #000000;"&gt; connection.getResponseCode();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(responseCode == 200&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取服务器返回的数据&lt;/span&gt;&lt;br/&gt;        InputStream stream =&lt;span style="color: #000000;"&gt; connection.getInputStream();&lt;br/&gt;        BufferedReader bufReader &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BufferedReader(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; InputStreamReader(stream));&lt;br/&gt;        String line &lt;/span&gt;= ""&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;((line = bufReader.readLine()) != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            buf.append(line);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; buf.toString();            &lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【参考资料】：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2521500.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521500.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521060.html</id><title type="text">ZOL1871 Steps</title><summary type="text">此题目比较简单。假设在一条直线上标记着数字刻度。每一步的步长不能为负数，且和前一个步长的关系必须是相等，或大于或小于1。第一步和最后一步的步长必须是1。则从 x 到 y 的最小步数是多少。</summary><published>2012-05-28T03:30:00Z</published><updated>2012-05-28T03:30:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521060.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521060.html"/><content type="html">&lt;p&gt;ZOL 1871: Steps&lt;/p&gt;&lt;p&gt;地址：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=871"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=871&lt;/a&gt;&lt;/p&gt;&lt;p&gt;题意：假设在一条直线上标记着数字刻度。每一步的步长不能为负数，且和前一个步长的关系必须是相等，或大于或小于1。第一步和最后一步的步长必须是1。则从 x 到 y 的最小步数是多少。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以用数学语言重新描述题目如下：给出无符号整数 d ( = &amp;nbsp;y-x )&amp;nbsp;，可分解为满足下列条件的 n 个正整数的和，求 n 的最小值:&lt;/p&gt;&lt;p&gt;&amp;nbsp;d = &amp;sum; Si ; (i = 1 ... n)&lt;/p&gt;&lt;p&gt;　&lt;/p&gt;&lt;p&gt;且满足：&lt;/p&gt;&lt;p&gt;S1 = Sn = 1;&lt;/p&gt;&lt;p&gt;| S(i + 1) - Si |&amp;nbsp;&amp;le; 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;分析：根据题目要求，理想条件下，为了达到最小步数，步长变化应该是从1，2，3 ... 一直增加到最大值 M，然后逐渐减小到1：&lt;/p&gt;&lt;p&gt;distance = y - x ;&lt;/p&gt;&lt;p&gt;distance = 1 + 2 + 3 + ... + M + ... + 3 + 2 + 1 = M^2;&lt;/p&gt;&lt;p&gt;steps = 2 * M - 1;&amp;nbsp; (步数)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;因此如果距离正好是一个平方数（M 的平方），则步数一定是（2M-1），其中 M 为 最大步长。当距离不是平方数时，假设介于 M^2&amp;nbsp;和 (M+1)^2 之间，则&lt;/p&gt;&lt;p&gt;distance = M^2 + remain; (0 &amp;lt; remain &amp;lt;= 2M )&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;remain 是平方数后的尾数，如果remain 小于等于 M，则我们只需要把一个 remain 的步长插入到前面的序列中即可。如果 remain 大于 M，则一步是不够的，我们至少需要插入两步，M 和 remain - M（当然，也可以是 remain/2 和 remain - remain/2）。因为我们不能插入大于 M 的步长，否则最终累加的和会达到下一个平方数（（M+1）的平方）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;因此根据上述分析，代码如下（代码中为了可读性，M 用 maxStep 表示）：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('476e7a15-604f-4351-ad30-1a0a81f80786')"&gt;&lt;div id="cnblogs_code_open_476e7a15-604f-4351-ad30-1a0a81f80786" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;#include &lt;/span&gt;&amp;lt;math.h&amp;gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt; argv[])&lt;br/&gt;{&lt;br/&gt;    unsigned &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, y = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    unsigned &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; distance, maxStep, remain, steps;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lu %lu&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x, &amp;amp;y) !=&lt;span style="color: #000000;"&gt; EOF)&lt;br/&gt;    {&lt;br/&gt;        distance &lt;/span&gt;= y -&lt;span style="color: #000000;"&gt; x;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(distance == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        maxStep &lt;/span&gt;= (unsigned &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)sqrt(distance);&lt;br/&gt;        remain &lt;/span&gt;= distance - maxStep *&lt;span style="color: #000000;"&gt; maxStep;&lt;br/&gt;&lt;br/&gt;        steps &lt;/span&gt;= maxStep * &lt;span style="color: #800080;"&gt;2&lt;/span&gt; - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(remain &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(remain &amp;lt;=&lt;span style="color: #000000;"&gt; maxStep)&lt;br/&gt;                steps&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                steps &lt;/span&gt;+= &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lu\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, steps);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2521060.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521060.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2012/02/16/2353493.html</id><title type="text">[发布] 电量监视+自动关机工具</title><summary type="text">这是一个主要用于在桌面上显示笔记本电池剩余电量的 windows 程序，同时也具有自动关机功能（自动关机功能我自己尚未实际测试过）。因此第一个功能，监视电池的剩余电量的百分比，这个主要对使用充电电池的笔记本电脑有用，台式机不能获取到电池数据，所以对台式机没什么意义。因此对台式机来说，它仅相当于一个自动关机的应用程序。</summary><published>2012-02-15T17:06:00Z</published><updated>2012-02-15T17:06:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2012/02/16/2353493.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2012/02/16/2353493.html"/><content type="html">&lt;p&gt;这是一个主要用于在桌面上显示笔记本电池剩余电量的 windows 程序，同时也具有自动关机功能（自动关机功能我自己尚未实际测试过）。因此第一个功能，监视电池的剩余电量的百分比，这个主要对使用充电电池的笔记本电脑有用，台式机不能获取到电池数据（显示NA），所以对台式机没什么意义。因此对台式机来说，它仅相当于一个自动关机的应用程序。&lt;/p&gt;&lt;p&gt;开发语言：C++；开发环境：VS2005；&lt;/p&gt;&lt;p&gt;该程序的前身来源于几年前我用 C# 开发的类似程序，现在的程序在绘制和效果上基本相同，只是舍弃了 C# 程序对 .net framework 平台的依赖，以及调用 Windows API 时那些不优雅的平台调用（Platform Invoke）代码。&lt;/p&gt;&lt;p&gt;可以让提示窗口自动依附到当前活动窗口的标题栏（靠右侧），为完成这个功能，我需要知道当前活动窗口，并且随着它移动而移动。效果如下图所示。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/22214/2012021600425214.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;放大到 400% 后的显示效果（左侧小图标表示交流电源在线）如下，可见文本被进度割裂成两部分，其前景和背景色为交替状态：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/22214/2012021602393753.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【注意：如果程序被 360 木马防火墙拦截】&lt;/p&gt;&lt;p&gt;为了完成依附到窗口标题栏的功能，我安装了一个全局的 CBT Hook&amp;nbsp;（功能位于 CBT.dll ），用于获知系统中的窗口被激活，窗口被移动，最大最小化，关闭等事件。由于用了 SetWindowsHookEx 等敏感的 API 函数，因此可能会如 360 木马防火墙拦截。如果你安装了 360 系列工具，请在运行之前，在360木马防火墙中把程序的 PowerMon.EXE 和 CBT.DLL 文件加入信任列表，或者在防护状态中关闭系统防御中的&amp;ldquo;文件系统防护&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;对系统通知区的图标点击右键，可以弹出上下文菜单，选择&amp;ldquo;自动关机&amp;rdquo;菜单，则弹出自动关机的设置窗口如下。可以设置在一段时间或者某个时刻自动关机。自动关机的计时单位精确到分钟。点击确定后，窗口由电池轮廓形状变成倒计时进度条，同时左侧会显示一个&amp;ldquo;电源&amp;rdquo;小图标（屏幕右下角通知图标也会切换成一个红色的关机图标），表示进入自动关机状态。如果要取消自动关机，只需再次点击通知图标的上下文菜单，选择&amp;ldquo;取消自动关机&amp;rdquo;即可。在倒计时结束后，仍然会弹出一个对话框请求用户确认自动关机，该对话框停留 20 秒钟时间给用户考虑，用户可以在考虑时间内取消自动关机。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/22214/2012021600453910.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过通知图标的上下文菜单，选择&amp;ldquo;选项&amp;rdquo;，如下图所示。关于设置功能，简单介绍如下：&lt;/p&gt;&lt;p&gt;（1）刷新频率：程序查询电池剩余电量的频率，单位是秒。&lt;/p&gt;&lt;p&gt;（2）不透明度：窗口的 Alpha 值，范围从 0 ~ 255。&lt;/p&gt;&lt;p&gt;（3）依附到当前窗口标题栏：如果不勾选，则程序窗口在屏幕上的位置不会发生变化，这时可以用鼠标进行拖动。勾选以后，窗口自动依附到当前窗口的标题栏靠右侧位置。&lt;/p&gt;&lt;p&gt;（4）忽略自绘窗口：由于程序使用的是系统配色进行绘制，因此依附到系统统一外观的标准标题栏上视觉效果最好。但是有很多窗口不是标准窗口，这些窗口可能采用了例如 DirectUI 技术来呈现自定义的个性外观，达到更美化的效果，例如 QQ 等客户端。因此依附到这些窗口的右上角时，两者的配色不能保证配色非常协调，因此程序默认，将不会依附到自绘窗口上。&lt;/p&gt;&lt;p&gt;（5）开机自动运行：如果勾选，将在注册表的下列位置创建 &amp;ldquo;powermon&amp;rdquo; 值，用于自动启动。取消打钩时删除该值。&lt;/p&gt;&lt;p&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/22214/2012021600592012.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【已知的一些问题】&lt;/p&gt;&lt;p&gt;（1）依附到窗口标题栏时，某些时候依附的位置不正确。目前已发现的包括窗口类为&amp;ldquo;CabinetWClass&amp;rdquo;的窗口，如 windows 资源管理器等。另外，有些时候某些窗口被激活时，电量提示窗未能依附到活动窗口。&lt;/p&gt;&lt;p&gt;（2）被依附的窗口关闭，最小化时，有时电量提示窗停留在原来的位置，在屏幕上呈现&amp;ldquo;悬空&amp;rdquo;状态。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【可执行文件下载链接】&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/PowerMon.rar"&gt;http://files.cnblogs.com/hoodlum1980/PowerMon.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【BUG修正】&lt;/p&gt;&lt;p&gt;（1）[H] 修复 CBTProc 中处理结束时没有调用 CallNextHookEx 的 bug，该 bug 可能引发输入法切换失效。&lt;/p&gt;&lt;p&gt;（2）[M] 修复更新进度条进度时，刷新矩形没有涵盖右下方向的行列像素问题，该 bug 导致显示问题。2012年2月20日。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2353493.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2012/02/16/2353493.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html</id><title type="text">ZOL1096 （Subway）和 ZOL1086（Octal Fractions）</title><summary type="text">本文讲解 ZOL 1096 和 ZOL 1086 的分析求解过程。其中ZOL 1096是一道关于地铁列车运行问题，给出四个参数（站点距离d，最大速度m，最大加速度a，最大加速度变化速度j），要求求出从一个站点到下一个站点的最短时间，通过数学和物理分析 v-t 曲线，从而得到 v-t 运行图的四种 case，然后给出结果。ZOL 1086 要求把 8 进制小数转换成 10 进制小数，但精度有所要求，因此引入一个数组来保存结果，另一个二维数组来保存二进制小数的基数，来得出满足题目要求精度的结果。</summary><published>2011-12-19T20:22:00Z</published><updated>2011-12-19T20:22:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html"/><content type="html">&lt;h1 style="text-align: center;"&gt;&lt;span style="font-size: 14pt;"&gt;（一）ZOL 1096：Subway&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;链接：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1096"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1096&lt;/a&gt;&lt;/p&gt;&lt;p&gt;题意：给出下列参数（所有参数均为小于等于1000的正整数），求地铁列车从一个站点到下一个站点之间的最短时间（精确到 0.1 秒）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;d&lt;/em&gt; - 地铁站之间的距离（米）;&lt;/p&gt;&lt;p&gt;&lt;em&gt;m&lt;/em&gt; - 列车的最大速度（米 / 秒）;&lt;/p&gt;&lt;p&gt;&lt;em&gt;a1&lt;/em&gt; - 最大加速度（绝对值）（米 / 秒^2);&lt;/p&gt;&lt;p&gt;&lt;em&gt;j1&lt;/em&gt; - 最大 jerk （绝对值）（米 / 秒^3).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;备注：最后一个条件中的 Jerk 就是加速度对时间的导数：d/dt (a); 相当于列车所受的合力对时间的变化率，该限制条件用于防止车厢内站立的乘客摔倒。&lt;/p&gt;&lt;p&gt;分析：此题的重点在于考察数学和物理基础，编程本身倒不重要。对这道题目，要求求列车运行的最短时间，显然，列车应该尽可能快的加速到最大速度，然后尽可能快的减速到停止。这个结论是很显然的。由于这是OnlineJudge 题目，所以我们也不必此结论做严格的数学证明。（如果不是这样，即列车没有尽可能快的加速，那么其 v- t 曲线就会位于最佳曲线的下方，为了保证面积相等，则其时间一定要超过最佳曲线）&lt;/p&gt;&lt;p&gt;可以绘制出列车运行的速度曲线 v = v( t )，根据物理知识，上诉条件相当于下列表达式：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;&amp;int; v dt = d;&lt;/span&gt; (列车走过的距离，即 v( t ) 曲线和横轴围成的面积)&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;v &amp;le; m;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;| d(v)/dt | &amp;le; a1;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;| d^2(v)/dt^2 | &amp;le; j1&lt;/span&gt;;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;根据前面的假设，v(t) 在起始阶段一定是以最大的 j1 在加速。因此：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（1）全力加速： v(t) = 1/2 * j1 * t^2;&amp;nbsp; 曲线 v 为一段抛物线。设持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t1&lt;/strong&gt;&lt;/span&gt;；加速度 a = j1 * t;&lt;/p&gt;&lt;p&gt;（2）当到达t1时，假设此时达到了最大加速度 a1。然后保持加速度为 a1 不变，进入匀加速直线运动阶段，此时曲线 v 为斜率为 a1 的直线。加速度 a = a1；设持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t3&lt;/strong&gt;&lt;/span&gt;；&lt;/p&gt;&lt;p&gt;（3）在此速度上继续加速，但尽全力降低加速速度，直到最大速度 m。曲线 v 依然是抛物线，只是开口方向相反。持续时间依然为 t1；加速度 a = - j1 * ( t - t1 - t3);&lt;/p&gt;&lt;p&gt;（4）已最大速度 m 进入匀速直线运动。曲线 v 是水平线段，加速度 a = 0；设该段的持续时间为 &lt;span style="color: #800080;"&gt;&lt;strong&gt;t2&lt;/strong&gt;&lt;/span&gt;；&lt;/p&gt;&lt;p&gt;（5）全力减速，抛物线，和（3）对称，持续时间为 t1。&lt;/p&gt;&lt;p&gt;（6）以最大减速速度 -a1 进行匀减速直线运动，斜率为 -a1 的直线线段，和（2）对称，持续时间为 t3。&lt;/p&gt;&lt;p&gt;（7）继续全力减速，直到停止在下一个站点，和（1）对称，持续时间为 t1。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意上诉过程包含了 4 个含有参数 j1 的抛物线片段，先解释下 j1 的物理含义，假设列车运行在光滑轨道上，只受到一个牵引力，则在这些时间段上，牵引力变化的最快，加速度变化的最快（乘客最容易因为惯性发生摇晃）。物理量 Jerk 表示的是加速度变化的速度，根据牛顿第二定律，也就是物体所受合力的变化速度。举个例子，列车如果正在用最大牵引力进行全力加速，这时候乘客倾向于向后倾倒，乘客需要用很大力气紧紧抓住车厢内的扶手，为了让乘客保持稳定，这个牵引力不应该猛然撤去，而应该逐渐减小（相当于上面的曲线片段3），如果在全力加速时一瞬间撤去牵引力，乘客就会感觉很不稳定很不舒服（上海地铁中这种现象很常见，乘客应该有所体会，在列车加速时非常不稳，也就是列车受力的变化速度太快，即 j 太大了，很显然我想上海地铁应该是达不到本题目中要求的这么理想化的）。同理，如果列车在静止状态或者匀速状态，牵引力也应该逐渐加大，而不是一瞬间加到最大（这会对列车产生&amp;ldquo;猛推&amp;rdquo;效果，造成乘客在车厢内摇晃）。&lt;/p&gt;&lt;p&gt;最大加速度 a1 的物理含义表征的是牵引或者制动时的最大合力，不考虑刹车的话也就相当于发动机的最大输出牵引力（注：不是功率）。&lt;/p&gt;&lt;p&gt;上诉过程的速度 v（t）曲线如下图所示（注意：图形中的背景色表示的仅是片段的物理运动性质，但不代表相互衔接的曲线一定来自相同函数，下面的 case 图与此相同）：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122007091638.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;很显然，曲线是关于垂直中心线轴对称的。求上诉曲线的积分即和 t 轴围成的面积很容易，抛物线由四个片段组成，它们能拼合成两个面积为 （m * t1）的矩形。斜率为 &amp;plusmn;a1 的匀加速直线运动部分，是两个梯形，它们也能拼合成一个面积为 （m * t3）的矩形。最后中间的匀速直线运动部分，是一个面积为（m * t2）的矩形。因此，对于上诉过程有：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;d = &amp;int; v dt = m * ( t1 * 2 + t3 + t2 );&lt;/span&gt;&amp;nbsp; &lt;span style="color: #008000;"&gt;// 两个站点之间的距离&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;min ( t ) = t1 * 4 + t3 * 2 + t2;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// 最短运行时间&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意：这是一种运动种类最多的&amp;ldquo;理想状况&amp;rdquo;，即距离 d 足够长，使得可以加速到最大速度 m； a1 要足够小，使得可以&amp;ldquo;割断&amp;rdquo;抛物线，出现斜线部分。实际上由于四个参数的值是任意给出的整数，这些参数可能只有一部分真正的对结果产生了限制作用，因此我们必须考虑下面的四种实际 case，如下图所示：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122314564949.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;（1）case 1：受到距离 d 的限制，不受 m，a1 的限制。曲线只有四个抛物线片段。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;根据：&lt;span style="color: #800080;"&gt;&amp;int;&amp;nbsp;v dt&amp;nbsp;= max(v) * t1 * 2 =&amp;nbsp;(j1 * t1^2) * t1 * 2 = &amp;nbsp;d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 =&amp;nbsp; [ (d / 2 j1) ^ (1/3) ] * 4;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max(v) = j1 * t1^2 &amp;le; m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;max(a) = j1 * t1 &amp;le; a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;　&lt;strong&gt;　（2）case 2：受到最大速度 m 的限制，即能加速到最大速度m（此种情况可认为不受距离 d 的限制，当然也可以说 m 太小），同时也不受 a1 的限制。曲线由四个抛物线片段加一段水平线段组成。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;根据：&lt;span style="color: #800080;"&gt;1/2 * j * (t1 ^ 2) = m / 2;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;求出：&lt;span style="color: #800080;"&gt;t1 = sqrt (m / j1);&lt;/span&gt; 以及 &lt;span style="color: #800080;"&gt;t2 = (d - m * t1 * 2)/m;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t2;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;m * t1 * 2 &amp;le; d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;max(a) = j1 * t1 &amp;le; a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不会受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　&lt;strong&gt;　（3）case 3：受到最大加速度 a1 的限制，同时受到距离 d 的限制，所以不能加速到最大速度 m （即不会受到最大速度 m 的限制）。曲线由四个抛物线片段加上两段斜率绝对值为 a1 的倾斜线段组成。则由下列方程：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;j1 * t1 = a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到 a1 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;max(v) = j1 * (t1^2) + a * t3;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;d = max(v) * (t1 * 2 + t3);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t3 * 2;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max(v) &amp;le; m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;t3 &amp;ge; 0;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（关于 t3 的负数解在后面讨论）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;整理上面的方程式，我们得到一个关于 t3 的一元二次方程如下：&lt;/p&gt;&lt;p&gt;&lt;em&gt;a1&lt;/em&gt; &lt;strong&gt;t3^2&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp; + &lt;em&gt;[ 3 (a1^2) / j1 ]&lt;/em&gt;&amp;nbsp; &lt;strong&gt;t3&lt;/strong&gt; + &lt;em&gt;[ 2 ( a1^3 ) / ( j1^2 ) - d ]&lt;/em&gt; = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以根据一元二次方程的求根公式求出上面的 t3，解有两个，显然应该舍弃其中为负数的根，取正数根。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;【注意】这里 t3 的被舍弃的负数解的数学和物理意义是什么？&lt;/span&gt; 在给出代码后将继续讨论这个问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;（4）case 4：就是前面分析过的所有运动都包括。受到 a1 的限制因此有斜线段部分，受到 m 的限制因此有水平线段部分。但不受到距离 d 的限制（即能加速到最大速度）。有：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;j1 * t1 = a1;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大加速度 a1 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;m = j1 * (t1^2) + a * t3;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（受到最大速度 m 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;t2 = ( d - m * t1 * 2 - m * t3 ) / m;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（不受到距离 d 的限制）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;span style="color: #800080;"&gt;min(t) = t1 * 4 + t3 * 2 + t2;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;case 4 需要满足的条件实际上不需要列出，因为如果前面的case都不满足条件，则一定会落入case 4。这里为了完备，我依然给出case 4需要满足的条件：&lt;/p&gt;&lt;p&gt;条件1：&lt;span style="color: #800080;"&gt;max ( v ) / 2&amp;nbsp;= 1/2 * j1 * (t1^2) &amp;le; m/2;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（为了能达到最大加速度a1，要有足够的加速空间，因此 m 必须足够大）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;条件2：&lt;span style="color: #800080;"&gt;m * ( t1*2 + t3 ) &amp;le; d;&lt;/span&gt; &lt;span style="color: #008000;"&gt;（为了达到最大速度，必须有足够长的距离，因此 d 必须足够大）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008000;"&gt;/***************************************************************/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;好了，现在我们已经考虑了四种 case，有没有任何遗漏的 case （要注意如果有就意味着 WA！）？考虑下斜线段出现的条件是不是一定要达到最大加速度 a1？是的，因为如果没有达到最大加速度 a1 就进入某个斜率小于 a1 的斜线段，那么如果我们继续走抛物线（因为这时速度上还有继续加速的空间，而加速度还没有上升到最大值 a1，所以抛物线是可继续的），就能更快达到最大速度，因此最终使用的时间一定会更短（假设在某点有两条岔路，一条是高速公路，一条是坑坑洼洼的土路，它们都是可选的，你选哪一条？）！&lt;/p&gt;&lt;p&gt;总结：注意上面的所有条件中都有等于号，等于即表示 case 和 case 之间的临界点。上面的 case 的排序是根据编码实现比较方便的情况，从 case 1 可以比较容易演化到后续的 case（但其他 case 之间的演化，参数之间的相互作用要稍复杂一些），例如：处于 case1 时，如果把 m 水平线向下移动（减小 m），就会从 case1 转入 case2；如果把表示斜率的那条射线向水平方向的 t 轴方向转动（减小 a1 ），就会从 case1 转入 case3；或者把距离拉长（增大 d），则曲线将向上浮动，最大速度将增大，如果先遇到 m 限制，则从 case1 转入 case2，如果先遇到 a1 限制，则从 case1 转入 case3。如果前面的case不能符合条件，则最终一定会落入位于后面的case（这里我依然是基于我个人的编程经验和直观印象，最好应该更严谨一点）。case1是最特殊也是最简单的情况。最后的结果是一个四元函数（超过了比较容易直观理解的维度）：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;min ( t ) = f (d, m, a1, j1);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以想象根据上面的求解过程，它类似分段函数，在不同范围内是关于不同变量的函数。&lt;/p&gt;&lt;p&gt;最后我们对上诉 case 给出下列表格：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #b0e0e6;" valign="center" width="60"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;CASES&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color: #b0e0e6;" valign="center" width="140"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;起到限制作用的参数&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color: #b0e0e6;" valign="center" width="280"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;运动组成&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color: #b0e0e6;" valign="center" width="120"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;最短时间&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 1&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;d&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 2&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;m&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 水平线(匀速)&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 3&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;d, a1&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&lt;td valign="top" width="280"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 斜线(匀加速)&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t3*2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="60"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;case 4&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="140"&gt;&lt;em&gt;&lt;span style="font-size: 12px;"&gt;m, a1&lt;/span&gt;&lt;/em&gt;&lt;/td&gt;&lt;td valign="top" width="320"&gt;&lt;span style="font-size: 12px;"&gt;抛物线, 斜线(匀加速), 水平线(匀速)&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="120"&gt;&lt;span style="font-size: 12px;"&gt;t1*4 + t3*2 + t2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意参数 j1 的用法和其他三个参数不同，它是直接应用到抛物线函数中的参数，是唯一被直接使用的参数（其他三个参数主要起到限制作用），所有 case 都会包含四个抛物线片段，所以上表中 j1 不会在&amp;ldquo;起到限制作用的参数&amp;rdquo;中列出。前面已经提到过，这是基于直观印象的结果，我们尚未（也并无必要）从数学上去证明这一点。&lt;/p&gt;&lt;p&gt;最后给出该题目的代码，实际上就是从上诉推导过程直接翻译过来，代码本身没有任何难度。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('f0a21891-1c95-4f6d-9ae7-e903b38a176c')"&gt;&lt;div id="cnblogs_code_open_f0a21891-1c95-4f6d-9ae7-e903b38a176c" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; GetMinTime(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; d, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; m, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; t1, t2, t3;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 1: 受限于路程d。全程 O(t^2) 加速，只有抛物线的四个片段组成 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = pow(d*&lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;/j, &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/&lt;span style="color: #800080;"&gt;3.0&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j * t1 &amp;lt;= a &amp;amp;&amp;amp; j * t1 * t1 &amp;lt;= m)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 2: case 1 的基础加上 v = m 的匀速运动。可以加速到最大速度m。&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = sqrt(m*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j*t1 &amp;lt;= a &amp;amp;&amp;amp; m*t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt; &amp;lt;= d)&lt;br /&gt;    {&lt;br /&gt;        t2 = d*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/m - t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 3: 受限于最大加速度a。全称加速，不能加速到最大速度m &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 含有两段匀加速直线运动 O(t^2) and O(t) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t1 = a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; aa = a;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; bb = a*a*&lt;span style="color: #800080;"&gt;3.0&lt;/span&gt;/j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; cc = a*a*a*&lt;span style="color: #800080;"&gt;2.0&lt;/span&gt;/(j*j) - d;&lt;br /&gt;    &lt;br /&gt;    t3 = (sqrt(bb*bb - &lt;span style="color: #800080;"&gt;4&lt;/span&gt;*aa*cc) - bb)/(aa*&lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; vmax = a*a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j + a*t3;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; double s = vmax * (t1 * 2 + t3); &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t3 &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; vmax &amp;lt;= m)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t3 * &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; case 4: 受限于最大速度m。中途匀速 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    t3 = m*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/a - a*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/j;&lt;br /&gt;    t2 = d*&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/m - (t1*&lt;span style="color: #800080;"&gt;2&lt;/span&gt; + t3);&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 此处必定满足：t1&amp;gt;=0, t2&amp;gt;=0, t3&amp;gt;=0 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; t1 * &lt;span style="color: #800080;"&gt;4&lt;/span&gt; + t3 * &lt;span style="color: #800080;"&gt;2&lt;/span&gt; + t2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; time;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; d, m, a, j;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;d, &amp;amp;m, &amp;amp;a, &amp;amp;j) != EOF)&lt;br /&gt;    {&lt;br /&gt;        time = GetMinTime(d, m, a, j);&lt;br /&gt;        time = ((&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)(time*&lt;span style="color: #800080;"&gt;10&lt;/span&gt; + &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;)) * &lt;span style="color: #800080;"&gt;0.1&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/* 对 0.1 以下的小数四舍五入 */&lt;/span&gt;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.01f\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, time);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后，这道题目的序号是1096，位于第一个 problem sets 内，可以说排序是非常靠前的，但 AC 数量目前只有 172 ，提交数量只有 558，可见这些数据还是反映了其&amp;ldquo;难度&amp;rdquo;，但是难度主要在于数学和物理知识基础上，和编程本身，算法等技巧上倒是没有太大关系。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;【补充讨论】case3 中 t3 的负数解的数学意义。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在case 3中，求解 t3 的一元二次方程现在提出一个问题，为什么出现负数解，其数学和物理意义是什么，该方程是由 d，a1，j1 （不受到 m 的限制）组成的表达式为系数。由于方程的前两个系数必定为正数，因此其中的一个根一定是负数（如果存在解）。那么为什么存在负数解，它的意义是什么？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;首先，在数学上，列出该方程的前提是，t3 &amp;gt;=0，最终列车经过抛物线和匀加速直线运动，到达下一个站点。我们对 d，a1，j1 代入具体数值，构造出一正一负的两个解。参数是：&lt;/p&gt;&lt;p&gt;a1 = 2; j1 = 2; d = 12;&lt;/p&gt;&lt;p&gt;这时候抛物线部分是标准抛物线 y = x^2;&lt;/p&gt;&lt;p&gt;可以解出 t1 = 1;&lt;/p&gt;&lt;p&gt;关于 t3 的方程是 t3^2 + 3 * t3 - 4 = (t3 - 1) (t3 + 4) = 0; 因此 t3 = 1 或者 t3 = -4；&lt;/p&gt;&lt;p&gt;可以在数学上绘制出 t3 的这两个解的情况的 v-t 曲线，如下图所示：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122022125787.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;图中红色线条部分就是 t3 = -4 的情况。图中的红色箭头表示的是积分方向。因此可见上面的曲线积分中，抛物线（t1）和斜线段（t3）之间由于积分方向不同，存在一些相互抵销作用。从而最终能积到面积 d。这是 t3 的负数解在数学上的含义。但是在物理意义上这样是很难理解的，因为从抛物线片段后，出现了&amp;ldquo;负时间&amp;rdquo;，即时间倒流，最终列车停下来时是出发前 4 秒中。因为向着 t 轴负方向，所以 a = dv/dt 并未发生突变。而这种情况在物理意义上比较难以理解。&lt;/p&gt;&lt;p&gt;为了更好理解，换一种方式，把上图中的斜线段部分全部向 t 的正方向映射（由于做了镜面映射，dx = -dx' 所以对应线段上的积分方向同时会被改变），从而上图会演化成下面的图形：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011122022225735.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在上图中，如果把 t3 视作正数，则意味着加速度在每个衔接点处发生突变（即列车受到无穷大作用力，或者列车质量忽略不计，可看作没有质量没有惯性的质点），显然这也是超现实的。如果不考虑图中的积分方向，则曲线形成的面积显然比 d 大，因此图中标示出了积分方向，实际上两部分是相互抵销作用（斜线部分的积分是 24，抛物线部分的积分是 -12，因此最终两者累加结果是 d = 12）。&lt;/p&gt;&lt;p&gt;尽管 t3 的负数解在物理上没有令人满意的含义，但这就是满足 v 的积分 = d 的数学上的另一种可能情况。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style="text-align: center;"&gt;&lt;span style="font-size: 14pt;"&gt;（二）ZOL 1086： Octal Factions&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;链接：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1086"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1086&lt;/a&gt;&lt;/p&gt;&lt;p&gt;题意：给出一个八进制的小数，转换为 10 进制小数。输出格式是：0.d1d2d3 ... dk [8] = 0.D1D2D3 ... Dm [10]；&lt;/p&gt;&lt;p&gt;例如对八进制小数0.75，转换为10进制，输出格式：0.75 [8] = 0.953125 [10]。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;分析：整数的进制转换的方法非常简单，而这道题目是小数进制转换，把 8 进制转换到 10 进制的直接方法是：&lt;/p&gt;&lt;p&gt;Decimal = d1 * 8^(-1) + d2 * 8^(-2) + ... + dk * 8 ^(-k)&lt;/p&gt;&lt;p&gt;例如对 0.75 （8进制），十进制小数 = 7&amp;nbsp;/ 8 &amp;nbsp;+ 5 / 64 = 0.963125;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但是仅仅从题目给出的样例输出来看，语言本身的内置数据类型 double 的精度可能已经不能满足要求了，因此这道题目看起来还是类似大数运算一类的题目，需要借助一个数组来存储数位。但是如果用上面的直接转换方法从 8 进制转换到 10 进制，用数组的方法，在编码实现上是很不方便的。所以考虑以 2 进制小数作为中介，即先把 8 进制转换到 2 进制小数，再转换到 10 进制。后面我们就能看到，这样我们就能很方便的利用数组来保存和给出具有任意精度（取决于数组大小，当然，如果追求更高精度也会引入少许时间和空间的代价）的结果。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;把 8 进制小数转换到 2 进制小数的方法非常简单，只需要把8进制小数的每一位用三位二进制数表示即可，例如 0.75 [8] = 0.111 101 [2]; 设 d1 = (b1 b2 b3) [2],&amp;nbsp; d2 = (b4 b5 b6) [2]：&lt;/p&gt;&lt;p&gt;则对应的：0.d1 d2 d3 ... dk [8]&amp;nbsp;= 0.b1 b2 b3&amp;nbsp; b4 b5 b6&amp;nbsp; ...&amp;nbsp; b(3k) b(3k+1) b(3k+2) [2]&lt;/p&gt;&lt;p&gt;这是显然的，因为：d1 = b1 * 4 + b2 * 2 + b3，...&lt;/p&gt;&lt;p&gt;所以 d1 * 8^(-1) + d2 * 8^(-2) + ... + dk * 8 ^(-k) = (b1*4 + b2*2 + b3) / 8 + ... = b1/2 + b2/4 + b3/8 + ... = 0.b1b2b3b4...[2];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再把这个二进制小数转换到 10 进制。为了精度需要，这里我引入一个数组：&lt;/p&gt;&lt;p&gt;unsigned char Dec[K];&amp;nbsp; // K 是一个常数，表征精度&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这个数组的意义是，如果10进制小数是 0.D1D2D3 ... Dm [10]，则 Dec[i] = D(i+1); 最终的10进制小数将是这样：&lt;/p&gt;&lt;p&gt;0. Dec[0]&amp;nbsp; Dec[1]&amp;nbsp; Dec[2]&amp;nbsp; ...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;打印时只需要在前面加上&amp;ldquo;0.&amp;rdquo;前缀，然后从 0 索引开始依次输出其元素即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里必须注意到二进制小数的小数点后第 k 位的基数 (0.5 ^ k) 的一个很重要的特征，即 (0.5 ^ k) 的小数点后的位数个数是 k（之后将全部是 0）。例如：&lt;/p&gt;&lt;p&gt;0.5，0.25，0.125，0.0625，...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意这个序列，b[ i + 1 ] = b[ i ] / 2; 由于末尾数永远是5，因此每一次除以 2 都会导致递增一位。因此引入另一个辅助存储空间，用于存储 2 进制小数的从小数点后第 1 位到第 K 位的基数（K 取决于需要的精度），显然这是一个矩阵，例如如果取 K&amp;nbsp;= 6，则定义矩阵 A ：&lt;/p&gt;&lt;p&gt;unsigned char A[6][8];&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;经过初始化计算后，A 的内容如下：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0, 0,&amp;nbsp;0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[0]: 0.5&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[1]: 0.25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;1, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0, 0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[2]: 0.125&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 6, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[3]: 0.0625&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 3, 1, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0, 0,&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[4]: 0.03125&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;0, 1, 5, 6, 2, 5,&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;0, 0,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// A[5]: 0.015625&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;它的右上角元素全是0，应该算是一个下三角矩阵。其意义是 A[k] 是二进制小数第 k+1 位的基数，即 A[k] = 1/2^(k+1); 小数位长度是 Length (A[k]) = k+1;&lt;/p&gt;&lt;p&gt;这个矩阵类似做菜时事先准备的材料，在求解之前先计算好备用。&lt;/p&gt;&lt;p&gt;求解过程如下，首先把结果 Dec 数组全部清零，然后对 8 进制的小数的每一位小数，当作三位二进制数，如果对应的位为 1，就把该位的基数（ A[k] ）逐位累加到结果数组 Dec。最后我们在从后（远离小数点的那一侧）向前处理进位即可，这个过程称为规整，即大数算法中最后的步骤。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('b3a5c7fe-4818-49bf-9758-b0c566460e96')"&gt;&lt;div id="cnblogs_code_open_b3a5c7fe-4818-49bf-9758-b0c566460e96" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 计算结果 0.N[0] N[1] ... &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Dec[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; A[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;][&lt;span style="color: #800080;"&gt;56&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A[k] = 1/( 2^(k+1) ) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A[k] 's digit length = (k + 1) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Init()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, carry = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    A[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;][&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;48&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; (i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;); j++)&lt;br /&gt;        {&lt;br /&gt;            A[i][j] = (A[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] + carry) / &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            carry = (A[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回 digit 数位长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Convert(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pOctNum)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 位索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; testNum[] = { &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt; };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, length = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, carry, digit;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* p = pOctNum + &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Ignore "0." &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    memset(Dec, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(Dec));&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        digit = *p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(digit &amp;amp; testNum[j])&lt;br /&gt;            {&lt;br /&gt;                length = index*&lt;span style="color: #800080;"&gt;3&lt;/span&gt; + j + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; length; i++)&lt;br /&gt;                    Dec[i] += A[index*&lt;span style="color: #800080;"&gt;3&lt;/span&gt; + j][i];&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        ++p;&lt;br /&gt;        ++index;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 归整数位 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = length; i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; --i)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Dec[i] &amp;gt; &lt;span style="color: #800080;"&gt;9&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            carry = Dec[i]/&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;            Dec[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] += carry; &lt;br /&gt;            Dec[i] = Dec[i] - carry * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; length;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; length, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];&lt;br /&gt;    Init();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL &amp;amp;&amp;amp; line[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        length = Convert(line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s [8] = 0.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; length; i++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Dec[i]);&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; [10]\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;总结：&lt;/p&gt;&lt;p&gt;（1）上面的方法，引入的辅助数据是二进制小数的基数，这是因为二进制小数在数位上只有 0 ，1 两种可能，这样实际上就是提供的结果就是，我们是否累加某一个基数到结果中。考虑如果我们用辅助空间存储的直接就是 8 进制小数的基础，则首先，我们要准备这样的基数的代码实现就比较麻烦（准备过程同样是大数除以一个小整数的大数运算！！）。另一点很不便的就是每个基数的小数的位长度和所在位之间没有直接的函数关系（而2进制小数的基数具有这样一个直接关系），我们还需要用对应的某一位上的数字去乘以这个基数再进行累加（而二进制小数的基数直接累加即可）。当然主要的麻烦在于第一点。第二点本来就位于大数算法中的过程之中，所以倒不显得困难。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（2）思考上面的累加过程然后规整数位，有一个累加进位的过程，但该过程是不可能使进位持续到整数部分的，即，假设一个小数的进制为 k ( k&amp;nbsp;&amp;gt;= 2 )，则如果小数点后每一位都是最大数字（k - 1），则这个小数在无限长循环下等于1。即：&lt;/p&gt;&lt;p&gt;1 = 0.99999...[10] = 0.11111...[2] = 0.77777...[8];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;该小数为数列的求和：&lt;/p&gt;&lt;p&gt;f (n) = (k-1) * (k^-1 + k^-2 + ... k ^ -n) =&amp;nbsp;&amp;nbsp; (1 - k^-n) ;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;n 趋向无穷大时，lim f(n) = 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（3）题目中并没有明确指明或者暗示我们最终结果的精度，我们如果想要得到更高精度可以把数组取得更大，同时会增加内存需求。因此 K 的取值需要逐渐调整然后提交去&amp;ldquo;试验&amp;rdquo;。最初我取 K 值为 256，空间需求略大。最终代码中取 K = 48，结果就内存就已经降低到了ZOL上 C 语言的典型内存需求（120 KB左右）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #993366;"&gt;&lt;strong&gt;【注】&lt;/strong&gt;本文插图由&lt;/span&gt; &lt;a href="http://www.peda.com/grafeq/" target="_blank"&gt;GrafEq&lt;/a&gt;&lt;span style="color: #993366;"&gt;&amp;nbsp;和 Photoshop CS 共同绘制。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2294124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/12/20/2294124.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html</id><title type="text">有关进程空间，全局变量，静态变量</title><summary type="text">最近在一些回复中提到了一些静态变量，线程安全性，递归函数调用的问题。尽管大概情况我已经清楚，但感觉自己在某些细节方面还稍显模糊，因此在这个问题应该从底层上做一个重新的总结，把一些比较容易产生模糊的问题总结下。</summary><published>2011-11-23T15:13:00Z</published><updated>2011-11-23T15:13:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html"/><content type="html">&lt;p&gt;【创新性声明】本文没有本质上的创新性内容。属于一些实验和总结，有少量&lt;strong&gt;主观推测&lt;/strong&gt;成分（有待进一步证实）。&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;写这一类文章是非常危险的&lt;/strong&gt;&lt;/span&gt;，因为有很多东西可能是我们不了解和比较模糊的，这很可能会出现错误的主观臆测，不仅仅是令明真相者贻笑大方的问题，更可怕的在于传播&amp;ldquo;错误&amp;rdquo;，这是我最为诚惶诚恐的一点。比如，我之前见到我指点过他的sun先生对于Photoshop中置换滤镜中的他的那些主观错误结论已经传遍网络，尽管可能没有太多人能关注到这个层面，但是我还是为这些错误的观点在网络上比比皆是而深感遗憾。正因为此，这篇文章我受限于个人水平，也不能100%确保自己不犯下认知性错误，因此此本（1）需要更专业的人的监督和意见，（2）可能随着我自己认知的变化而进行修订和变更。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最近在一些回复中提到了一些静态变量，线程安全性，递归函数调用的问题。尽管大概情况我已经清楚，但感觉自己在某些细节方面还稍显模糊，因此在这个问题应该从底层上做一个重新的总结，把一些比较容易产生模糊的问题总结下。&lt;/p&gt;&lt;p&gt;（1）全局变量，和静态变量位于进程空间什么位置。&lt;/p&gt;&lt;p&gt;为此，我用 VC6 新建了一个 Windows Console Application 。并输入代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c118aa03-6a43-4373-bf00-a74b67247570')"&gt;&lt;div id="cnblogs_code_open_c118aa03-6a43-4373-bf00-a74b67247570" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;process.h&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;#include &amp;lt;tchar.h&amp;gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef HANDLE (WINAPI *FuncPtr)(&lt;br /&gt;    LPSECURITY_ATTRIBUTES lpThreadAttributes,&lt;br /&gt;    SIZE_T dwStackSize,&lt;br /&gt;    LPTHREAD_START_ROUTINE lpStartAddress,&lt;br /&gt;    LPVOID lpParameter,&lt;br /&gt;    DWORD dwCreationFlags,&lt;br /&gt;    LPDWORD lpThreadId&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; TestClass&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;    TestClass()&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestClass's constructor.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    ~TestClass()&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestClass's destructor.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;TestClass g_class;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp1 = &lt;span style="color: #800080;"&gt;0x11223344&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp2;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Array[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g_Temp3;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;The default size for the reserved and initially committed stack memory &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;is specified in the executable file header. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;DWORD WINAPI threadProc(LPVOID lpParameter)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; threadIndex = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)lpParameter;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: auto variable on new thread's stack (thread: %d)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;a, threadIndex);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic1 = &lt;span style="color: #800080;"&gt;0x12345678&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic2 = &lt;span style="color: #800080;"&gt;0x00abcdef&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStatic3;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = g_Temp1 &amp;amp; &lt;span style="color: #800080;"&gt;0xffff&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pConstData = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello World&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pConstData[1] = 0; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存访问冲突（不可写）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pHeap1 = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*)malloc(&lt;span style="color: #800080;"&gt;32&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pHeap2 = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*)malloc(&lt;span style="color: #800080;"&gt;32&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---enter main----\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    HMODULE hModule = GetModuleHandle(_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Kernel32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: Module (Kernel32.dll)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hModule);&lt;br /&gt;&lt;br /&gt;    FuncPtr pFunc = CreateThread;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: FuncPtr (CreateThread)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pFunc);&lt;br /&gt;    &lt;br /&gt;    DWORD tid1, tid2;&lt;br /&gt;    HANDLE hThread1 = CreateThread(NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, threadProc, (LPVOID)&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, CREATE_SUSPENDED, &amp;amp;tid1);&lt;br /&gt;    HANDLE hThread2 = CreateThread(NULL, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, threadProc, (LPVOID)&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, CREATE_SUSPENDED, &amp;amp;tid2);&lt;br /&gt;    &lt;br /&gt;    ResumeThread(hThread1);&lt;br /&gt;    WaitForSingleObject(hThread1, &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;    CloseHandle(hThread1);&lt;br /&gt;    ResumeThread(hThread2);&lt;br /&gt;    WaitForSingleObject(hThread2, &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;    CloseHandle(hThread2);&lt;br /&gt;    &lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: auto variable on main thread's stack\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;a);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: memory alloc on heap: pHeap1 (32 bytes)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pHeap1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: memory alloc on heap: pHeap2 (32 bytes)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pHeap2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: address of const data(\"hello world\")\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pConstData);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp1 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp2 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Array (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, g_Array);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: global variable g_Temp3 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;g_Temp3);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic1 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic1);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic2 (initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%p: static variable nStatic3 (not initialized)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;nStatic3);&lt;br /&gt;    free(pHeap1);&lt;br /&gt;    free(pHeap2);&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---leave main----\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在这个例子里我添加了全局变量，auto 类型的栈上临时变量，函数内的静态变量，以及新创建的线程的栈上的变量等。此程序产生的输入如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('006317b9-1b68-4fa9-98cc-bb9125d45ac3')"&gt;&lt;div id="cnblogs_code_open_006317b9-1b68-4fa9-98cc-bb9125d45ac3" class="cnblogs_code_hide"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; TestClass&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s constructor.&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; ---enter main----&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; 7C800000: Module (Kernel32.dll)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; 7C810647: FuncPtr (CreateThread)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; 0052FFB0: auto variable on &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack (thread: 1)&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; 0062FFB0: auto variable on &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack (thread: 2)&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; 0012FF7C: auto variable on main thread&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s stack&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; 00370FE0: memory alloc on heap: pHeap1 (&lt;span style="color: #800080;"&gt;32&lt;/span&gt; bytes)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #800080;"&gt;00371038&lt;/span&gt;: memory alloc on heap: pHeap2 (&lt;span style="color: #800080;"&gt;32&lt;/span&gt; bytes)&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #800080;"&gt;00423148&lt;/span&gt;: address of &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; data(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello world&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; 00425B40: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp1 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; 00428D78: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp2 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; 00428D68: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Array (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; 00428D64: &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; variable g_Temp3 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; 00425B44: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic1 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; 00425B48: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic2 (initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; 00428D60: &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; variable nStatic3 (not initialized)&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; ---leave main----&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; TestClass&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s destructor.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;首先，我们可以看到一个类的实例作为全局变量，它的构造函数在进入入口点函数（main）之前被调用，在main函数之后被析构。这显示这个过程应该是包装在main函数外层的函数，也就是 CRT 做的。&lt;/p&gt;&lt;p&gt;上面的输出给出了各个变量在进程空间中的地址（虚拟内存地址），因此我们再对照一下编译后的PE文件的 SectionHeader 的信息，使用我编写的文件格式查看器打开编译后的EXE文件，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011112319222023.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;根据PE文件中的信息:&lt;/p&gt;&lt;p&gt;ImageBase = 0x0040 0000;&lt;/p&gt;&lt;p&gt;SectionAlignment = 0x1000;&lt;/p&gt;&lt;p&gt;FileAlignment = 0x1000;&lt;/p&gt;&lt;p&gt;可以根据 section header 的信息知道，各个段在进程空间中的地址是（对比程序输出，可知全局变量和常量字符串在那个段范围内）:&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;section&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;From&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;To&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Characteristics&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.text&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00421790&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00422790&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可执行，可读&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;代码段&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.rdata&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00423000&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00424777&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;初始化数据段（常量）&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.data&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;00425000&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042A730&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可写&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;初始化数据段（全局和静态变量）&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.idata&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042B000&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042B7CC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可写&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="64"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;.reloc&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042C000&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="76"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;0042CEC9&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;可读，可丢弃&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="249"&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;基址重定位&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上表是根据PE文件中的信息给出了进程空间中各个段的地址范围。因此我们根据运行时的输出情况，可以很容易的确定哪些变量具体位于进程空间的那个段中。例如针对这个具体的实例来说，全局变量和函数内静态变量位于 .data 段，常量字符串位于 .rdata 。&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意由于 SectionAlignment 和 FileAlignment 是相同的，因此文件中的内容和映射后，节之间的相对位置是没有变化的。节的特性被设置给内存页，因此如果代码中试图对内存执行没有权限的操作，例如对常量字符串的地址进行写入，系统就会告知错误。可以看到 section 的起始地址使用 sectionAlignment （默认 0x1000）对齐。数据段默认不具有共享属性，被映射以后数据是该进程空间所私有的。但共享的段则在所有进程实例中共享。可以设定某个段为共享，当使用一个DLL时，则数据通过DLL来给所有进程共享，共享意味着在所有进程空间中，该段被映射到相同的物理内存页。例如《windows 核心编程》中有一个例子，当创建多个进程实例，对话框上能实时更新的显示出当前实例的个数。（同时这也是作为用于控制只能运行一个进程实例的方法之一）：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Tell the compiler to put this initialized variable in its own Shared &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; section so it is shared by all instances of this application.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; data_seg("Shared")&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; LONG g_lApplicationInstances = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; data_seg()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Tell the linker to make the Shared section readable, writable, and shared.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt; comment(linker, "/Section:Shared,RWS")&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以看出常量字符串代码中的"Hello World&amp;rdquo;位于.rdata节，该节是不可写的。全局变量和静态变量都位于.data节，可读可写。代码中已初始化的数据在节内位于靠近节前部地址较低的地方，未初始化的数据靠地址较高的地方。对于程序中的基本类型变量例如整形等，实际上它们从文件中被读入内存后就已具有了初值，相当于完成了初始化。但对于一个类的实例来说，对其初始化需要调用其构造函数。这些都需要在进入入口点函数之前完成。&lt;/p&gt;&lt;p&gt;因此现在我们可以明确：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;char str[] = "Hello World";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;含义是 str 数组是位于栈上的数组，然后从初始化段（只读）拷贝字符串内容到栈上的数组。（编译器可能对其用 DWORD 进行拷贝）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;char *str = "Hello World";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;str 是位于栈上的一个指针，指向初始化段的只读数据。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;初学者一般不太容易立即区分出上面的代码在底层上的区别：前者是栈上的数组，数组空间在栈上分配。编译器会插入代码，在运行时把数据从只读数据段拷贝到栈上空间。所以前者的 str 是可写的。后者是栈上的一个指针变量，指向只读数据段上的某个位置（在C++里面这样的赋值合法，是为了照顾成千上万的已有 C 代码，此处参考了参考资料（5）《The C++ Programming Language》中的叙述）。后者的 str 是不可写的。如果试图修改它，在编译上是通过的，但运行时属于不确定行为。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我先后创建两个新的线程，是为了观察新线程的栈的位置，可以看到在这个例子中，在创建时我没有指定栈的大小，默认是 1MB。从低地址往高地址数，主线程的栈在进程空间中相当靠前，（中间的空隙属于堆），然后是那些 sections，然后此处剩下很大的一段空隙又基本上全部是属于堆。然后是新创建的线程的栈（默认 1MB），它们的地址看起来已经相当高。然后是那些被影射进来的DLL，系统 DLL 都经过了 Rebase，一般位于比较高地址的地方（靠近 2GB 边界），最后是系统控制的空间边界（0x80000000）。当然，默认情况下，是程序员和系统各占 4GB 空间的一半，但可以通过启动的配置参数让程序员负责的空间达到 3GB。因此上面的范例的进程空间大体如下图所示：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011112321383221.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;当然这个图只是针对这个控制台程序例子的特例而绘制，只是给出该例子中进程空间的示意图。图中箭头表示的是栈的增长方向。当一个进程中运行多个线程时，它们各自拥有独立的栈。当然这些栈之间由于位于相同的地址空间，所以它们彼此是可见的。因此一个线程可以把自己的栈上地址传递给其他线程进行处理，但这种地址随着线程退出就会失效，因此必须做线程同步，即阻塞式等待。例如不能使用 PostMessage 传递栈上的地址给其他窗口的窗口过程，而使用 SendMessage 是可行的。&lt;/p&gt;&lt;p&gt;当我们提到并发性和多线程安全，通常在针对一个函数讲时，是进程空间内的多个线程同时调用该函数是否会引发问题。并发还指多个线程对同一资源的访问和使用，例如数据库，文件等。如果一个函数是可重入的，则它不能直接或简介的使用，引用静态，全局性变量（尤其是对这些共享性变量的读写不是原子性的，且这些变量的值的准确性如果对于使用者来说是关键的状态性数据，则会引入诸如&amp;ldquo;脏读&amp;rdquo;等问题），也不能直接或简介调用不可重入的函数。栈上的一个 auto 类型变量是多线程安全的，是因为栈是属于线程的，彼此独立，因此 auto 类型变量对于线程来说相当于&amp;ldquo;私有数据&amp;rdquo;。对于递归函数，每一层递推都会在栈上增加一层 stackframe，因此函数内的临时变量位于其各自调用所属的 stackframe 中，也相当于彼此独立。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（2）系统调度，消息队列的基本单位。&lt;/p&gt;&lt;p&gt;这里我们提及的是进程和线程，不再考虑线程以下的概念。考虑下面的问题：&lt;/p&gt;&lt;p&gt;2.1 拥有消息队列的基本单位是什么？A。窗口；B。线程。&lt;/p&gt;&lt;p&gt;答案是线程。但通常我们更容易把消息队列和窗口关联在一起，这仅仅是因为事件驱动给我们的一种主观表象。由于调度的基本单位是线程，因此处理消息和拥有消息队列的基本单位也是线程。系统派送消息的目标，是把消息送到创建窗口的线程所拥有的消息队列。然后该线程被调度得到时间片，由消息循环（DispatchMessage）间接调用该窗口的窗口过程函数。但一个线程不一定拥有消息队列，例如只专注于运算不负责接受消息控制的后台线程，只有线程调用 PeekMessage，GetMessage 一类的函数时，系统才会为这个线程创建消息队列。拥有消息队列的线程也不一定会创建窗口，但是创建窗口的线程就会接收到和窗口有关的各种消息。&lt;/p&gt;&lt;p&gt;总结一下，线程中根据其功能又可以大致的分为主线程（或者在GUI程序中通俗的理解为 UI 线程）和后台线程。消息中的一部分属于窗口消息，这些消息是和一个具体的窗口关联并以创建该窗口的线程的消息队列作为目标的（最终线程的消息循环负责引发对窗口过程的调用，即 DispatchMessage），但并不是所有的消息都会和具体窗口关联。例如普通的线程消息（而一个线程也可能不会创建任何窗口）。窗口消息中的一部分又可以属于对话框消息。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;2.2 比较特殊的几个消息：WM_MOUSEMOVE, WM_TIMER, WM_PAINT, WM_QUIT; (待完成）&lt;/p&gt;&lt;p&gt;线程消息分为三种类型：incoming sent message; posted message; input message; 在标准术语里面，第一种被称为非队列消息，后两种称为队列消息，也就是被理解为&amp;ldquo;位于消息队列中的消息&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;（1）《程序员的自我修养》，俞甲子 等。&lt;/p&gt;&lt;p&gt;（2）&amp;ldquo;Billy Belceb 病毒教程Win32篇&amp;rdquo;（选自《看雪学院五周年纪念收藏版》）, Billy Belceb。&lt;/p&gt;&lt;p&gt;（3）《windows核心编程》, Jeffery Richer.&lt;/p&gt;&lt;p&gt;（4）《Tho Old New Things》, Raymond Chen.&lt;/p&gt;&lt;p&gt;（5）《The C++ Programming Language》，BS。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;【补充说明】&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;本文已有的评论，因为涉及到有具体所指的个人主观性意见，于技术探讨交流上没有任何积极意义，因此不在技术博客保留，已转移到163博客的以下地址进行备份性保留（可以点击以下地址观看原有评论）：&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px; color: #ff0000;"&gt;&lt;strong&gt;&lt;a href="http://blog.163.com/jinfd@126/blog/static/62332277201211104431759/"&gt;http://blog.163.com/jinfd@126/blog/static/62332277201211104431759/&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;本文评论在此处被删除的原因是，其内容和技术或讨论主题无关（例如无实质内容，明显针对人的主观评价等）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;--hoodlum1980，2012年2月1日。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2260932.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/23/2260932.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html</id><title type="text">ZOL 简单题集合（三）</title><summary type="text">ZOL 简单题目集合之三</summary><published>2011-11-18T12:17:00Z</published><updated>2011-11-18T12:17:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html"/><content type="html">&lt;p&gt;（1）ZOL1045. HangOver (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1045"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1045&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在桌子边码扑克牌，给出表示扑克牌延伸出桌子的距离的浮点数，问需要多少张牌。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('2848f7d8-c838-4943-8949-3cf1b1fc49d6')"&gt;&lt;div id="cnblogs_code_open_2848f7d8-c838-4943-8949-3cf1b1fc49d6" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetCardCount(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; dx = &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(dx &amp;lt; c)&lt;br /&gt;    {&lt;br /&gt;        result++;&lt;br /&gt;        dx += &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;/(result + &lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; c;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;c);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;lt; &lt;span style="color: #800080;"&gt;0.001&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        result = GetCardCount(c);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d card(s)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, result);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（2）ZOL1061. Web Navigation (0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1061"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1061&lt;/a&gt;&lt;/p&gt;&lt;p&gt;模拟浏览器的前进后退功能，给出初始时刻的当前页面，然后经过一系列命令：访问某个url，前进，后退，如果命令有效，输出当前页面。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('467ec50e-b149-45bc-8fe2-65d4d90c86b5')"&gt;&lt;div id="cnblogs_code_open_467ec50e-b149-45bc-8fe2-65d4d90c86b5" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; sForw[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;72&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pForw;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; sBack[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;72&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pBack;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; curUrl[&lt;span style="color: #800080;"&gt;72&lt;/span&gt;], line[&lt;span style="color: #800080;"&gt;96&lt;/span&gt;];&lt;br /&gt;    &lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case和case之间的空行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         gets(line);&lt;br /&gt;        strcpy(curUrl, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.acm.org/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        pForw = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        pBack = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BACK&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the backward stack is empty, the command is ignored.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pBack &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ignored\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the forward stack.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    ++pForw;&lt;br /&gt;                    strcpy(sForw[pForw], curUrl);&lt;br /&gt;                    &lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Pop the page from the top of the backward stack, &lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;making it the new current page.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    strcpy(curUrl, sBack[pBack]);&lt;br /&gt;                    --pBack;&lt;br /&gt;&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FORWARD&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the forward stack is empty, the command is ignored.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pForw &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ignored\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the backward stack. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    ++pBack;&lt;br /&gt;                    strcpy(sBack[pBack], curUrl);&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Pop the page from the top of the forward stack, &lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;making it the new current page.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    strcpy(curUrl, sForw[pForw]);&lt;br /&gt;                    --pForw;&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strncmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;VISIT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Push the current page on the top of the backward stack, &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                ++pBack;&lt;br /&gt;                strcpy(sBack[pBack], curUrl);&lt;br /&gt;                &lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;and, make the URL specified the new current page. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                strcpy(curUrl, line + &lt;span style="color: #800080;"&gt;6&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;The forward stack is emptied.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                pForw = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, curUrl);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(line, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;QUIT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case 和 case 之间用空行隔开&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注意这个if条件，如果没有，则导致PE！（多打印一个空行）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; n - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（3）ZOL1067. Color Me Less (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1067"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1067&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出16个RGB值作为关键颜色，对后续给出的颜色，要求用欧几里德距离最短的方式，被映射到哪个关键颜色上。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4a401ca5-1e14-4390-856f-7a33500ae818')"&gt;&lt;div id="cnblogs_code_open_4a401ca5-1e14-4390-856f-7a33500ae818" class="cnblogs_code_hide"&gt;include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagColor&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; r;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b;&lt;br /&gt;} Color;&lt;br /&gt;&lt;br /&gt;Color colors[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetMappedIndex(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; r, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; g, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&lt;br /&gt;{&lt;br /&gt;    unsigned &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; distance = &lt;span style="color: #800080;"&gt;0xFFFFFFFF&lt;/span&gt;;&lt;br /&gt;    unsigned &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; temp;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, index = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        temp = (r-colors[i].r) * (r-colors[i].r);&lt;br /&gt;        temp += (g-colors[i].g) * (g-colors[i].g);&lt;br /&gt;        temp += (b-colors[i].b) * (b-colors[i].b);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(temp &amp;lt; distance)&lt;br /&gt;        {&lt;br /&gt;            distance = temp;&lt;br /&gt;            index = i;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; index;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, r, g, b;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;br /&gt;            &amp;amp;colors[i].r, &amp;amp;colors[i].g, &amp;amp;colors[i].b);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;r, &amp;amp;g, &amp;amp;b);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(r == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        i = GetMappedIndex(r, g, b);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(%d,%d,%d) maps to (%d,%d,%d)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;            r, g, b, colors[i].r, colors[i].g, colors[i].b);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（4）ZOL1123. Triangle Encapsulation（0.5）&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1123"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1123&lt;/a&gt;&lt;/p&gt;&lt;p&gt;依次给出一个三角形按逆时针方向排列的三个顶点的坐标（所有坐标范围在 -9 ~ 9 之间），要求求平面上被这个三角形完全围在内部的所有整数坐标的点。而且这道题目对输出格式有特别要求，不好描述，就是输出的点排列的就像他们在笛卡尔座标中的位置那样。&lt;/p&gt;&lt;p&gt;解法：首先这道题目求解一个点是否在三角形，可以用常规的点在多边形内的射线法。但还可以用线段旋转方向（即叉积）来判断，如果点P在三角形ABC内部，则AB，BC，CA旋转到P的时针方向必然全都相同。如果在外部，则必定不满足这个条件。而且此题还明确说明，三个点ABC是逆时针排列的，所以三条边从逆时针转过去，转到P点如果都是&amp;ldquo;右转&amp;rdquo;，则说明点P在三角形内。如果P在三角形的边上，叉积为0。因此只要遍历三角形的外接矩形内的所有整数坐标点，依次判断即可。最后为了按题目要求的格式进行输出，采用一个辅助队列缓存所有解，最后得到了最左侧的点的位置以后，所有解的打印位置也就确定了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('75193afa-995e-4f30-997a-677585a99128')"&gt;&lt;div id="cnblogs_code_open_75193afa-995e-4f30-997a-677585a99128" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#ifndef __min&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __min(a, b) ((a)&amp;lt;(b)? (a):(b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#ifndef __max&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __max(a, b) ((a)&amp;gt;(b)? (a):(b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagPOINT&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; x;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; y;&lt;br /&gt;} POINT;&lt;br /&gt;&lt;br /&gt;POINT pts[&lt;span style="color: #800080;"&gt;90&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pts_top; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Queue 指针&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; (Pi-&amp;gt;Pk) * (Pi-&amp;gt;Pj) 从 PI-PK 转向 PI-PJ 的方向&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &amp;gt; 0: 左转&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &amp;lt; 0: 右转&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; = 0: 共线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Direction(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yi,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yj,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; yk)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (xk-xi)*(yj-yi) - (xj-xi)*(yk-yi);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;三角形的三个顶点（逆时针方向）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x0, y0, x1, y1, x2, y2, x, y;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, top, right, bottom;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; min_x, i, j, cur_y;&lt;br /&gt;&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Program 4 by team X\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d %d %d %d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;        &amp;amp;x0, &amp;amp;y0, &amp;amp;x1, &amp;amp;y1, &amp;amp;x2, &amp;amp;y2) != EOF)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化case&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        pts_top = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        min_x  = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        left = __min(__min(x0, x1), x2);&lt;br /&gt;        top = __max(__max(y0, y1), y2);&lt;br /&gt;        right = __max(__max(x0, x1), x2);&lt;br /&gt;        bottom = __min(__min(y0, y1), y2);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在矩形整数阵列中搜寻三角形内部的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(y = top; y &amp;gt;= bottom; y--)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(x = left; x &amp;lt;= right; x++)&lt;br /&gt;            {&lt;br /&gt;                if( Direction(x0, y0, x1, y1, x, y) &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                if( Direction(x1, y1, x2, y2, x, y) &amp;lt;= 0) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                if( Direction(x2, y2, x0, y0, x, y) &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这是一个内部的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   ++pts_top;&lt;br /&gt;                pts[pts_top].x = x;&lt;br /&gt;                pts[pts_top].y = y;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;更新最左的点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x &amp;lt; min_x) min_x = x;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打印输出结果！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         cur_y = -&lt;span style="color: #800080;"&gt;10&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前y坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt;= pts_top; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;换行了?&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pts[i].y != cur_y) &lt;br /&gt;            {&lt;br /&gt;                cur_y = pts[i].y;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;不是第一行，则换行！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;本行前面的前导打印多少个空格？&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                  &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; ( pts[i].x - min_x ) * &lt;span style="color: #800080;"&gt;9&lt;/span&gt;; j++)&lt;br /&gt;                    printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;没有换行，则在两个点之间打印一个空格&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(%2d, %2d)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pts[i].x, pts[i].y);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;case结束后还需要输出一个空行！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;End of program 4 by team X\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（5）ZOL1244. Definite Values (0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1244"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1244&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最开始只有变量 a 有确定值，执行一系列赋值语句后，要求按字典顺序，输出所有有确定值的变量。如果任何变量都没有确定值，输出 none 。但这个题题目里没有明确的说清楚，就是所有变量名都是单字母，有了这个假设这个题目其实非常简单。但如果我们不考虑这一点，而是变量名任意，那显然还要建立符号表，又要变得更麻烦。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('37e4dc1d-6b2e-4886-91cf-4879b788795d')"&gt;&lt;div id="cnblogs_code_open_37e4dc1d-6b2e-4886-91cf-4879b788795d" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; variables[&lt;span style="color: #800080;"&gt;26&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;32&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, nCase = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, charCount;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        getchar(); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 取走回车符号 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        ++nCase;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Init: a is definite. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        variables[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;26&lt;/span&gt;; i++)&lt;br /&gt;            variables[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            variables[line[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;] = variables[line[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;]-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Program #%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, nCase);&lt;br /&gt;        charCount = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;26&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(variables[i] &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                line[charCount] = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + i;&lt;br /&gt;                charCount++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(charCount &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; charCount; i++)&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;            }&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;none\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（6）ZOL1858. Soundex (0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1858"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1858&lt;/a&gt;&lt;/p&gt;&lt;p&gt;把单词按照发音归类，给出一个单词的拼写，按照规则求出这个单词的一个发音归类代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c9cf36f9-275c-4fbd-aa69-5c9762f75bc3')"&gt;&lt;div id="cnblogs_code_open_c9cf36f9-275c-4fbd-aa69-5c9762f75bc3" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetSoundexCode(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* buf, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* word)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; last_code = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, cur_code;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* strs[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] = { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BFPV&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CGJKQSXZ&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DT&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;L&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MN&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;R&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pDest = buf;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pSrc = word;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*pSrc)&lt;br /&gt;    {&lt;br /&gt;        cur_code = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strchr(strs[i], *pSrc) != NULL)&lt;br /&gt;            {&lt;br /&gt;                cur_code = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + i;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(last_code != cur_code &amp;amp;&amp;amp; cur_code &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            *pDest = cur_code;&lt;br /&gt;            ++pDest;    &lt;br /&gt;        }&lt;br /&gt;        last_code = cur_code;&lt;br /&gt;        ++pSrc;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;null-terminator!&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    *pDest = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;], code[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL)&lt;br /&gt;    {&lt;br /&gt;        GetSoundexCode(code, line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, code);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;备注：题目后面括号内的数字为我的主观认定难度值。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2254606.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254606.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html</id><title type="text">[发布] QQGame 连连看辅助工具（限制功能版）</title><summary type="text">前几天想起了这个想法，然后最近两天开发了这个工具，就是用于 QQGame 中的连连看的辅助工具。本来是想把全部代码都公开的，但是我在调试程序的时候注意到腾讯在qqgame中宣传卖那些游戏道具。所以我的想法就改变了下，不想影响腾讯卖这些道具来赚钱，所以我把原来完整功能版的版本又加上了一些限制。</summary><published>2011-11-18T11:12:00Z</published><updated>2011-11-18T11:12:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html"/><content type="html">&lt;p&gt;前几天想起了这个想法，然后最近两天开发了这个工具，就是用于 QQGame 中的连连看的辅助工具。本来是想把全部代码都公开的，但是我在调试程序的时候注意到腾讯在qqgame中宣传卖那些游戏道具。所以我的想法就改变了下，不想影响腾讯卖这些道具来赚钱，所以我把原来完整功能版的版本又加上了一些限制。&lt;/p&gt;&lt;p&gt;辅助工具实现的功能包括：全自动点击，自动重排（当方块无解时），显示可点击方块提示（相当于官方的指南针功能），模拟单步点击。&lt;/p&gt;&lt;p&gt;首先进入 QQGame，连连看，开始游戏后如下图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818261085.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;启动工具后的界面如下图所示，点击任务栏按钮即可。具体用法参考任务栏的tooltip和压缩包中的简要说明。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818284472.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后我为这个版本加了以下限制，使他不至于惹上&amp;ldquo;影响别人赚钱&amp;rdquo;的嫌疑（虽然我一向非常鄙视腾讯）。主要限制如下：&lt;/p&gt;&lt;p&gt;（1）自动点击的速度限制在 1 秒一次点击，但可以暂时体验 500 ms 速度。更快的点击速度全部被禁用！&lt;br /&gt;（2）提示数量超过16个（相当于道具中的指南针）时，每次需要输入验证码才能继续。&lt;br /&gt;（3）快速连击&amp;ldquo;消掉一对方块&amp;rdquo;的次数如果超过10次，则需要输入验证码才能继续。此处快速连击是指两次点击时间间隔小于 1 秒。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作为兴趣，验证码对话框是我今天加上去的，显然这个手段也是我和腾讯学习来的，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111818344023.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个对话框比较简单，我用代码动态生成一个图片显示在上面，当然题目也是动态生成的，题目主要是 100 以内的加减乘除法。图片中我放了随机的贝塞尔彩色线条作为干扰。问题里面的每个字符采用了位置和角度的轻微抖动，但是没有经过变形，因为我是用 GDI 函数绘制的文本。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面介绍下这个辅助工具的一些内容，首先我寻找到游戏中的窗口后，需要确定的棋盘网格的内容，最早我的想法是用4到5个关键点采样来检测方块。但是后来我实际开发时发现，比较幸运的是，能选取特定的方块坐标，可以仅仅用一个采样点就能区分出所有方块。满足这样高区分度条件的采样点一共有四个，被我用代码寻找了出来。检测方块时，相比之前的&amp;ldquo;快速美女找茬&amp;rdquo;工具，这次我用了效率更高些的直接对位图数据块寻址来检测。当然，这要求对位图中的像素定位（即在内存数据块中定位到某个位置的某个通道）需要非常熟悉，我在自己的博客中介绍过多次，这里就不重复了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;确定了棋盘网格的内容后，就是这个工具的核心，即寻解的方法。从这点上来说，其实程序的寻解和人的寻解本质上并没有什么不同，只不过两者的侧重点稍有区别。在程序中，在确定棋盘网格的过程中，我就建立了对每一种方块都建立了一个双向链表（采用双向链表的原因是因为随着寻解的过程，需要频繁的进行节点脱链操作），去存储他们的坐标。这样的目的是不需要反复的盲目扫描棋盘，而是把精力集中到判断两个方块是否有通路就可以了。游戏中的方块多达 40 多种，所以我用一个指针数组来存储所有链表的 Head。取决于游戏的设计，链表数量较多，但长度较短（例如为 4 ）。所以尽管寻解算法的时间复杂度相对与链表长度为 O(n^2)，但整个求解过程依然是感觉很快，后台运算的线程感觉是瞬间就退出的，以至于我觉得哪怕是用户需要的时候再算时间都来得及，根本不需要另起一个线程来求解了。当完全不使用定时器延时时，令我感到吃惊的是，仿佛是就点了一下，然后所有方块就全部消失的无影无踪了，这根本违背了我们平时观看到的场景印象。由于方块消失的太快，整个游戏窗口都弥漫在一团烟雾效果中。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面我给出的是连连看的&amp;ldquo;通路&amp;rdquo;判断方法，这是所有连连看的共同游戏规则。不管是什么连连看游戏，你都能在代码中看到这个函数，只不过可能形式有多种多样而已。由于分别在两个方向上检测，所以两部分的代码惊人的一致，这也可能让我这样有完美主义倾向的人感觉不爽，想把两部分代码合并成一个循环（我们把网格指针的偏移作为变量，分别存放到一个含有两个元素的数组中即可，例如如果我们要在水平方向上移动，偏移量是+-1，在垂直方向上移动，偏移量是+-行宽度），这当然是可以的，但我想可能会牺牲掉一部分代码可读性。下面的代码非常简洁，它的主题是来自我以前发表在 BCCN上 的 TC2.0版的连连看（DOS贴图版）中的代码：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('a0ebba97-b70e-470b-ad3c-b27095452a57')"&gt;&lt;div id="cnblogs_code_open_a0ebba97-b70e-470b-ad3c-b27095452a57" class="cnblogs_code_hide"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;连连看游戏的核心算法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;BOOL CanConnect(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;11&lt;/span&gt;][&lt;span style="color: #800080;"&gt;19&lt;/span&gt;], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row1, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col1, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row2, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; path, i, j, left, right, top, bottom;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; min1, min2, max1, max2;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;-----------------查找水平方向----------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    min1 = max1 = col1;&lt;br /&gt;    min2 = max2 = col2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[row1][min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min1--;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[row2][min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min2--;&lt;br /&gt;    left = __max(min1, min2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;19&lt;/span&gt; &amp;amp;&amp;amp; map[row1][max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max1++;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;19&lt;/span&gt; &amp;amp;&amp;amp; map[row2][max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max2++;&lt;br /&gt;    right = __min(max1, max2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;检查两条水平线之间是否有可连通的垂直线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt;= right; i++)&lt;br /&gt;    {&lt;br /&gt;        path = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = __min(row1, row2) + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt; __max(row1, row2); j++)&lt;br /&gt;        {&lt;br /&gt;            path += map[j][i];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;-----------------查找垂直方向----------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    min1 = max1 = row1;&lt;br /&gt;    min2 = max2 = row2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[min1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col1] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min1--;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[min2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col2] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) min2--;&lt;br /&gt;    top = __max(min1, min2);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;11&lt;/span&gt; &amp;amp;&amp;amp; map[max1 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col1] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max1++;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;11&lt;/span&gt; &amp;amp;&amp;amp; map[max2 + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;][col2] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) max2++;&lt;br /&gt;    bottom = __min(max1, max2);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;检查两条垂直线之间是否有可连通的水平线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = top; j &amp;lt;= bottom; j++)&lt;br /&gt;    {&lt;br /&gt;        path = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = __min(col1, col2) + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; __max(col1, col2); i++)&lt;br /&gt;        {&lt;br /&gt;            path += map[j][i];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(path == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面是后台线程的代码，调用了上面的方法，过程类似绘制&amp;ldquo;金刚石&amp;rdquo;图形（所有顶点彼此连线），和冒泡排序一类的时间复杂度相同。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3e07fa46-175d-45ac-b94d-ef2e0c144026')"&gt;&lt;div id="cnblogs_code_open_3e07fa46-175d-45ac-b94d-ef2e0c144026" class="cnblogs_code_hide"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;用于寻找可点击方块的后台线程，进入线程时，map 已经初始化好了&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;DWORD WINAPI MyThread(LPVOID lpParameter)&lt;br /&gt;{&lt;br /&gt;    PMYTHREAD_PARAMS pMyParams = (PMYTHREAD_PARAMS)lpParameter;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    HWND hwnd = pMyParams-&amp;gt;hWndUI;&lt;br /&gt;    PCELLPOS pNode1, pNode2;&lt;br /&gt;    BOOL bAllListIsNull;&lt;br /&gt;    BOOL bFind_One_Solution; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否找到了一个解&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( !bThreadStopSignal )&lt;br /&gt;    {&lt;br /&gt;        bAllListIsNull = TRUE;&lt;br /&gt;        bFind_One_Solution = FALSE;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;此处暴力的盲目搜索就是了~。~ 有时间的话需要让此处更&amp;ldquo;智能化&amp;rdquo;！&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pCellPos[0]就是代表空白位置的链表，永远为 NULL （浪费掉了）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; CELL_TYPE_COUNT; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在链表中搜索是否可点击类似金刚石画法，时间复杂度：O(n^2)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCellPos[i] != NULL)&lt;br /&gt;            {&lt;br /&gt;                bAllListIsNull = FALSE; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;存在链表不为空&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                   pNode1 = pCellPos[i];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode1 != NULL)&lt;br /&gt;                {&lt;br /&gt;                    pNode2 = pNode1-&amp;gt;pNext;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode2 != NULL)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(CanConnect(map, pNode1-&amp;gt;row, pNode1-&amp;gt;col, pNode2-&amp;gt;row, pNode2-&amp;gt;col))&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到了一对可点击方块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                                 map[pNode1-&amp;gt;row][pNode1-&amp;gt;col] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                            map[pNode2-&amp;gt;row][pNode2-&amp;gt;col] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                            &lt;br /&gt;                            CLICKINFO cInfo;&lt;br /&gt;                            cInfo.row1 = pNode1-&amp;gt;row;&lt;br /&gt;                            cInfo.col1 = pNode1-&amp;gt;col;&lt;br /&gt;                            cInfo.row2 = pNode2-&amp;gt;row;&lt;br /&gt;                            cInfo.col2 = pNode2-&amp;gt;col;&lt;br /&gt;                            SendMessage(hwnd, WM_CLICKINFO_FIND, (WPARAM)pMyParams-&amp;gt;bIsAutoClick, (LPARAM)(&amp;amp;cInfo));&lt;br /&gt;                            &lt;br /&gt;                            RemoveNodeFromList(&amp;amp;pCellPos[i], pNode1);&lt;br /&gt;                            RemoveNodeFromList(&amp;amp;pCellPos[i], pNode2);&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            bFind_One_Solution = TRUE;                        &lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;由于两个Node都已经被释放了，所以必须立即结束对当前链表中的搜索。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bFind_One_Solution)&lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                        pNode2 = pNode2-&amp;gt;pNext;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bFind_One_Solution)&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                    pNode1 = pNode1-&amp;gt;pNext;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;已经没有方块了？&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bAllListIsNull)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;发送消息，所有解已经搜索完毕，游戏可以胜利清空所有方块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              PostMessage(hwnd, WM_SOLUTION_COMPLETE, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;对所有链表都搜索完毕了，但找不到解，需要重排！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!bFind_One_Solution)&lt;br /&gt;        {&lt;br /&gt;            PostMessage(hwnd, WM_NEED_RERANGE, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    bThreadRunning = FALSE;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;最后这里的双向链表，还有队列等辅助数据结构当然都可以选用STL中的模板，而我没有用STL，此处全部是自写的。这样的好处可能就是非常直观吧，所有代码都在自己的眼皮底下，比较放心罢了。这里给出几个双向链表操作函数，实际上非常简单非常简短。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('8b941893-4ef3-45da-ac55-fe1533653857')"&gt;&lt;div id="cnblogs_code_open_8b941893-4ef3-45da-ac55-fe1533653857" class="cnblogs_code_hide"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;释放某一个链表，最后把表头置为NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeList(PCELLPOS* ppHead)&lt;br /&gt;{&lt;br /&gt;    PCELLPOS pTmp = NULL;&lt;br /&gt;    PCELLPOS pNode = *ppHead;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode != NULL)&lt;br /&gt;    {&lt;br /&gt;        pTmp = pNode-&amp;gt;pNext;&lt;br /&gt;        free(pNode);&lt;br /&gt;        pNode = pTmp;&lt;br /&gt;    }&lt;br /&gt;    (*ppHead) = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把一个新节点挂接到指定链表上，如果链表为空，则会被创建！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddNodeToList(PCELLPOS* ppHead, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col)&lt;br /&gt;{&lt;br /&gt;    PCELLPOS pNewNode = (PCELLPOS)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(CELLPOS));&lt;br /&gt;    pNewNode-&amp;gt;row = row;&lt;br /&gt;    pNewNode-&amp;gt;col = col;&lt;br /&gt;    pNewNode-&amp;gt;pForward = NULL;&lt;br /&gt;    pNewNode-&amp;gt;pNext = NULL;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*ppHead == NULL)&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNewNode;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到tail节点，然后挂接上去！&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         PCELLPOS pCur = *ppHead;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur-&amp;gt;pNext != NULL)&lt;br /&gt;            pCur = pCur-&amp;gt;pNext;&lt;br /&gt;&lt;br /&gt;        pNewNode-&amp;gt;pForward = pCur;&lt;br /&gt;        pCur-&amp;gt;pNext = pNewNode;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;从链表中把指定的节点除去，如果是最后一个节点，则会导致该链表被置为 NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; RemoveNodeFromList(PCELLPOS* ppHead, PCELLPOS pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是表头吗&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode == *ppHead)&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNode-&amp;gt;pNext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; [Forward] &amp;lt;--&amp;gt; [X] &amp;lt;--&amp;gt; [Next]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; [Forward] &amp;lt;-----------&amp;gt; [Next]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;pForward != NULL)&lt;br /&gt;        pNode-&amp;gt;pForward-&amp;gt;pNext = pNode-&amp;gt;pNext;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;pNext != NULL)&lt;br /&gt;        pNode-&amp;gt;pNext-&amp;gt;pForward = pNode-&amp;gt;pForward;&lt;br /&gt;&lt;br /&gt;    free(pNode);&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;其中，提示可点击方块时，没有直接用窗口 DC 或者屏幕 DC，我用的是 SetWindowRgn 方法（如果用 LayeredWindow 的 COLOR_KEY 会有闪烁，所以改为用 Window RGN）。&lt;/p&gt;&lt;p&gt;最后，暂时发布工具的可执行文件，该工具是采用VS2005 + WIN32 Platform SDK开发，完全绿色的。但它在关闭的时候会在自身所在文件夹下面防止一个 INI 配置文件，实际上我在程序里已经写好了所有默认值，但把 INI 文件放在程序所在位置，也是为了让用户知道那些地方可以配置。但有一项我写死在代码里面了，就是方块样本集合位图的行容量固定为 8，这样的目的是我可以对除法和取余（MOD）用位操作来实现。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载链接：&lt;/strong&gt;&lt;a href="http://files.cnblogs.com/hoodlum1980/LLKHelper.rar"&gt;http://files.cnblogs.com/hoodlum1980/LLKHelper.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;相同性质文章：《&lt;a id="ctl01_TitleUrl" href="http://www.cnblogs.com/hoodlum1980/archive/2009/05/25/1488571.html"&gt;快速&amp;ldquo;美女找茬&amp;rdquo;（辅助工具）&lt;/a&gt;》&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【补充说明】 by hoodlum1980 @ 2011-11-20&lt;/p&gt;&lt;p&gt;&amp;nbsp;我发现有些人在肆无忌惮的使用&amp;ldquo;秒杀&amp;rdquo;级别的疑似外挂。所以也促使我进行改进。主要是加了系统全局性热键，程序自身的快捷键（因为按键的反应速度要比鼠标点击快），在比拼秒杀速度的时候取消开启线程，而是合并到 UI 线程一次性完成。改进搜索解的循环方式，从每次复位改为轮转式。最终我发现实际上成了反应速度的比拼。假使秒杀耗时是 0.1 秒（具体到底多少可能也无法精确测量），那么如果谁反应速度稍微快 0.1 秒，先行启动，就会赢。所以同为秒杀速度，由于秒杀耗时极短，远小于人能观察出的时间间隔，所以在算法上可能已经很难拼出优势来了。比如从其他方向下手进行改进。当然我也考虑了自动对别人应用各种障碍型道具，但是如果起跑反应慢一点的话，实际上一切都没用，因为你根本不会有应用道具的时间，游戏已经被对方结束了。反正已经够快了，估计暂时就这样了~。~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2254524.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/18/2254524.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html</id><title type="text">ZOL3505 ( Yet Another Set of Numbers ) 解题报告</title><summary type="text">题意：有一个数字集合，集合中的数遵循以下规则：（1）每个数字的第一位（最高位）不是0; （2）每个数字包含最多 N 位，且只有 0，1，2，3 这四个数字可能出现。（0 &lt; N &lt; 20）; （3）每个数字的相邻位不同（例如：301是有效的，300不是）; （4）数字比较大小和他们的字符串比较方法相同（例如：1 &lt; 123 &lt; 20 &lt; 21 &lt; 3）. 问题是：求满足以下条件的数字A：在集合中恰好有 K-1 个数字比A大，比B小;</summary><published>2011-11-09T19:16:00Z</published><updated>2011-11-09T19:16:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: 18pt;"&gt;ZOL 3505：&lt;span class="bigProblemTitle"&gt;Yet Another Set of Numbers&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;地址：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3505"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3505&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;题意：有一个数字集合，集合中的数遵循以下规则：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #800080;"&gt;( 1 ). 每个数字的最高位不是 0 ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;( 2 ). 每个数字包含最多 N 位，且只有 0，1，2，3 这四个数字可能出现（0 &amp;lt; N &amp;lt; 20）;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;( 3 ). 每个数字的相邻位不同（例如：301是有效的，300不是）;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;( 4 ). 数字比较大小和他们的字符串比较方法相同（例如：1 &amp;lt; 123 &amp;lt; 20 &amp;lt; 21 &amp;lt; 3）.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;问题是，给出这个集合中的一个数字 B，从数字 B 开始，在这个集合中向前数数到第 K 个数字时输出这个数字（K &amp;gt; 0）;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;原文叙述：求满足以下条件的数字A：在集合中恰好有 ( K - 1 ) 个数字大于 A 小于 B （题目保证存在解）;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;时空限制：Time Limit: &lt;/span&gt;2 Seconds;&amp;nbsp; Memory Limit: 65,536 KB;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;例如：当 N = 2 时，这个集合中一共有 12 个数字，依次是：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;1 &amp;lt; 10 &amp;lt; 12 &amp;lt;&amp;nbsp; &lt;strong&gt;[ &lt;span style="color: #ff0000;"&gt;13 &lt;/span&gt;]&lt;/strong&gt; &amp;lt; 2 &amp;lt; 20 &amp;lt; 21 &amp;lt; 23 &amp;lt; &lt;strong&gt;[ &lt;span style="color: #0000ff;"&gt;3 &lt;/span&gt;]&lt;/strong&gt; &amp;lt; 30 &amp;lt; 31 &amp;lt; 32;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;----（序列中A和B用方括号标示）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;当 B = 3 时，K = 5 时，从集合中的 3 向前数到第&amp;nbsp;5 个数字时是 13，因此应该输出 13。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（1）第一个解法，模拟法（Result：TLE）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;我想到的第一个解法是，观察这个序列的规律，然后用模拟数数的方法，依次向前数，数到第 K 个为止即可。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;考虑集合中最大的一个数字的字符串表示，显然是以下形式 "3232..."（长度为 N）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;因此可以给出下面的模拟数数的第一个解，模拟法代码如下：&amp;nbsp;&lt;span style="background-color: #ffcc99; color: #ff0000;"&gt; ( X. 以下代码算法时间超出题目限制 ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c14a2deb-e638-497a-9cad-8e59365af54a')"&gt;&lt;div id="cnblogs_code_open_c14a2deb-e638-497a-9cad-8e59365af54a" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; length; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前数字的字符串长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; Num[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;检测当前数字是否合法&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; IsNumValid()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 第一位不能为0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相邻位不能相同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; (length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;); i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[i] == Num[i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetNextNum(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; _MaxChars[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;32&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 如果最后一个字符是0，则去掉结尾的0 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            length--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//ELSE: &lt;/span&gt;&lt;span style="color: #008000;"&gt;当前字符递减后，立即扩展到 N 的长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = Num[length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = length; i &amp;lt; N; i++)&lt;br /&gt;        {&lt;br /&gt;            Num[i] = _MaxChars[ (i - length) &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ];    &lt;br /&gt;        }&lt;br /&gt;        length = N;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( !IsNumValid() );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符串最大长度, 0 &amp;lt; N &amp;lt; 20 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; K = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;往下数第K个数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;往下数多少个&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;N, &amp;amp;K) != EOF)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Num);        &lt;br /&gt;        length = strlen(Num);        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; index &amp;lt; K; index++)&lt;br /&gt;        {&lt;br /&gt;            GetNextNum(N);&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Num);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;br /&gt;但第一个方法提交后超时。显然，如果 N 比较大，这个集合中的数字数量是非常大的，因此这时 K 也可以取得很大。而这个方法是一个笨方法，是一个一个数字向前找，且还要进行数字合法校验，时间效率很低。当 N 和 K 都比较大时，这个方法在速度上显然不能满足要求。因此不能使用笨方法，必须找出这个序列中蕴藏的内在规律。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（2）速度更快的解法：使用三叉树模型（Result：MLE）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;观察这个序列的规律，考虑数字用字符串进行比较的特点，比较时，越高（靠左）的位越重要，越低的位则不重要。&lt;/span&gt;&lt;span class="bigProblemTitle"&gt;因此考虑把每一位看作一个节点，则低位属于高位的子节点，父子节点彼此属于相邻的位，显然有每个节点含有三个子节点（由于每一位上只能在 0，1，2，3 中选择，且不能与父节点数字相同），因此形成一个满的三叉树。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;每个节点代表了序列中的一个数字，把从根节点到该节点的路径所经过的节点依次输出，就是这个数字的字符串表示。当 N = 2 时，该树如下图所示：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111001535314.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;题意中的规则（2）规定了树的高度，规则（1）和（3）使该树从完全四叉树变成完全三叉树，规则（1）去掉了&amp;ldquo;0&amp;rdquo; 子树，规则（3）缩减了子节点个数。&lt;/p&gt;&lt;p&gt;考虑两个树节点 N1&amp;nbsp;和 N2 之间的排序关系（比较时，深度小的节点比深度大的节点重要），注意和字符串比较算法进行对比：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;（a）如果 N1 节点位于 N2 的路径上，则路径短的节点小；( eg. 123 &amp;lt; 1230 )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;（b）如果 N1 和 N2 在节点 N' 处开始分离（从根节点到 N&amp;rsquo; 处路径重合），则进入 N' 左侧子树的小于进入 N' 右侧子树的。( eg. 121230&amp;nbsp;&amp;lt; 123&amp;nbsp;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;（c）从前两点可知，此树前序遍历（先遍历当前节点的所有子节点，然后访问当前节点），即为数集合的有序排列。（对比：二叉查找树的中序遍历为有序序列）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;图中节点圆圈中的黑色数字就是用于组成输出数字的位（num）。为了统计树中每个子树所代表的子序列中的数字个数，我们在每个节点上加一个属性 sum，表示以该节点为根的子树所表征的数字组成的子序列的数字个数，在图中用节点旁边的红色数字表示。显然，节点的 sum，就是以该节点为根的子树所包含的所有节点的数目，因为每个节点都一对一的代表集合中一个数字，用节点路径表示（&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;类似贪心算法中的霍夫曼编码和霍夫曼树的关系&lt;/span&gt;）。由于输出节点路径时，根节点无需输出 ( dummy node )，因此根节点用阴影填充，和子节点的连线用虚线表示。&lt;/p&gt;&lt;p&gt;显然，最底层的所有叶子节点（深度为 N + 1）仅代表一个数字，其 sum = 1，对非叶子节点，其三个子节点的 sum 值相同，再加上自身节点代表的数字，因此有：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Node.sum = Node.Child[&lt;span style="color: #ff0000;"&gt;0&lt;/span&gt;].sum * &lt;span style="color: #ff0000;"&gt;3&lt;/span&gt; + &lt;span style="color: #ff0000;"&gt;1&lt;/span&gt; ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;因此对于本题目来说，可以创建这样一个三叉树，对于给定的数字 B，设它对应的是树中的节点 B，从 B 节点开始，向前回退寻找目标节点 A。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;为了清楚的描述算法，我用节点游标的形式来阐述该算法（在代码中可以是一个节点的指针，表示当前所处的位置），并做如下定义：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;(a). K 的逻辑含义是，代表当前节点和目标节点 A 的&amp;ldquo;&lt;strong&gt;距离&lt;/strong&gt;&amp;rdquo;。寻找过程中 K 的值将不断减小，直到为 K = 0 ，表示到达目标节点A。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;(b). 游标指向的改变称为 &amp;ldquo;&lt;strong&gt;移动到&amp;rdquo; &lt;/strong&gt;某个节点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;(c). 如果节点需要处理（即调整 K 值），称为&amp;ldquo;&lt;strong&gt;访问&lt;/strong&gt;&amp;rdquo; ( visit ) 该节点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;(d). 如果节点不需要处理（即不需要调整 K 值），称为&amp;ldquo;&lt;strong&gt;经过&lt;/strong&gt;&amp;rdquo; ( pass ) &amp;nbsp;该节点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;则算法（2）的基本步骤（&lt;span style="color: #800080;"&gt;GetNodeBySteps&lt;/span&gt; ）如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #0000ff;"&gt;(2.1). 令游标指向起始节点 B; &lt;span style="color: #008000;"&gt;（这是准备工作，接下来将&amp;ldquo;向前&amp;rdquo;寻找节点 A）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span class="bigProblemTitle"&gt;(2.2). 如果所在节点已经是兄弟节点中的老大（位于最左侧），则（向上）&amp;ldquo;&lt;strong&gt;访问&lt;/strong&gt;&amp;rdquo;其父节点，令 &lt;span style="color: #ff0000;"&gt;K = K - 1&lt;/span&gt;;&amp;nbsp; 跳到（2.6）; &lt;span style="color: #008000;"&gt;（请思考为什么此处 K 的递减值是 1 而不是 Node.sum？）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span class="bigProblemTitle"&gt;(2.3). 如果所在节点有哥哥节点，则（向左）移动到它的哥哥节点; &lt;span style="color: #008000;"&gt;（接下来在 （2.4）和（2.5）中一定能找到一个可访问节点，请思考这是为什么？）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #0000ff;"&gt;(2.4).&amp;nbsp;如果 Node.sum&amp;nbsp;&amp;lt;= K ，则&lt;strong&gt;&amp;ldquo;访问&amp;rdquo;&lt;/strong&gt;该节点，令 &lt;span style="color: #ff0000;"&gt;K = K - Node.sum&lt;/span&gt;，跳到（2.6）;&lt;span style="color: #008000;"&gt; （备注：Node.sum &amp;lt; K 时说明 A 不位于该节点为根的子树中）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;(2.5). 如果 Node.sum &amp;gt; K，&lt;span style="color: #008000;"&gt;（备注：说明 A 位于 Node 为根的子树中） &lt;/span&gt;则连续的（向下）移动到当前节点的（最右侧）最幼子节点，直到找到符合（2.4）中的条件（Node.Sum &amp;lt;= k）的节点为止，然后用和（2.3）的相同方法&lt;strong&gt;&amp;ldquo;访问&amp;rdquo;&lt;/strong&gt;它：令 &lt;span style="color: #ff0000;"&gt;K = K - Node.sum&lt;/span&gt;; &lt;span style="color: #008000;"&gt;（这是一个嵌在内部的 while 循环）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;(2.6). 如果 K != 0，则重复（2.2）~ （2.5）。直到 K = 0 为止，此时我们到达的节点就是目标节点 A，输出节点 A 的路径就是问题的解;&lt;span style="color: #008000;"&gt;（这是最外层的 while 循环）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;总结上面的探查方法：如果一个节点是被访问节点，则绝不会再进入它的任何子树；当寻找下一个可访问节点时，如果左侧有哥哥节点，则一定先探查哥哥节点（如果哥哥节点没有超越目标，则访问它；否则进入它的幼子子树继续探查），否则访问父节点（此时父节点必是可访问节点）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上面的语言接近伪码，括号内的描述属于导航时的逻辑方向或备注性说明。显然（2.2）~（2.6）整体是一个 while 循环，其中（2.5）是嵌在其内的又一个 while 循环。上诉步骤即对应的是代码中的 &lt;span style="color: #800080;"&gt;GetNodeBySteps&lt;/span&gt; 方法，参数 step 即 K。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;【&lt;strong&gt;思考】：为何（2.2）向父节点回退时的访问和（2.4）和（2.5）中的访问方法不同，&lt;/strong&gt;前者令 K 递减 &lt;span style="color: #800080;"&gt;1&lt;/span&gt;，后者令 K 递减 &lt;span style="color: #800080;"&gt;Node.sum&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008000;"&gt;&lt;em&gt;&lt;/em&gt;（提示：前者，当子节点向父节点&amp;ldquo;回退&amp;rdquo;时，子节点为根的子树位于其父节点所代表的子树中。后者则进入到了另一个独立的子树。）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;第二个解法的代码（三叉树方法），如下所示：&amp;nbsp;&lt;span style="background-color: #ffcc99; color: #ff0000;"&gt; ( X. 以下代码内存使用超出题目限制 ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4d165e46-9eaf-4b75-a084-7c2c1e8e92bf')"&gt;&lt;div id="cnblogs_code_open_4d165e46-9eaf-4b75-a084-7c2c1e8e92bf" class="cnblogs_code_hide"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _NODE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; index;  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在兄弟节点中的排行索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; num;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点数字, 只能取下列值 0,1,2,3，为 'R' 时表示 root &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; sum;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 + 3 + 9 + ... + 3^k &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    _NODE* parent;   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 父节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    _NODE* child[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 子节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;} NODE, *PNODE;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/* &lt;/span&gt;&lt;span style="color: #008000;"&gt;递归函数： N - 树的深度（不含根节点的深度） &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddChildren(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, _num = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;;&lt;br /&gt;    PNODE pChild = NULL;&lt;br /&gt;    pNode-&amp;gt;sum = pNode-&amp;gt;sum * &lt;span style="color: #800080;"&gt;3&lt;/span&gt; + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;child[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == NULL)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            pChild = (PNODE)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;            memset(pChild, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;            pChild-&amp;gt;parent = pNode;&lt;br /&gt;            pChild-&amp;gt;index = i;&lt;br /&gt;            pChild-&amp;gt;sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 回避父节点数字 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;num == _num) _num++;&lt;br /&gt;            pChild-&amp;gt;num = _num++;&lt;br /&gt;&lt;br /&gt;            pNode-&amp;gt;child[i] = pChild;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;            AddChildren(pNode-&amp;gt;child[i]);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;PNODE CreateTree(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    PNODE pRoot = (PNODE)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;    memset(pRoot, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(NODE));&lt;br /&gt;    pRoot-&amp;gt;num = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;根节点数字为0，可以让第一层子节点为1，2，3 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    pRoot-&amp;gt;sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; depth; i++)&lt;br /&gt;    {&lt;br /&gt;        AddChildren(pRoot);&lt;br /&gt;    }&lt;br /&gt;    pRoot-&amp;gt;num = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;R&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pRoot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 释放树占用的内存（递归函数） &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeTree(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pNode-&amp;gt;child[i] != NULL)&lt;br /&gt;        {&lt;br /&gt;            FreeTree(pNode-&amp;gt;child[i]);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    free(pNode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从节点 pStart 向前追溯到某个节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;PNODE GetNodeBySteps(PNODE pRoot, PNODE pStart, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; step)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; remainStep = step;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index;&lt;br /&gt;    PNODE pCurNode = pStart, pNextNode = NULL;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(remainStep &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;找到下一个不大于 remainStep 距离的节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        index = pCurNode-&amp;gt;index;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 向上返回一层时，只-1 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            pCurNode = pCurNode-&amp;gt;parent;&lt;br /&gt;            remainStep--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        pNextNode = pCurNode-&amp;gt;parent-&amp;gt;child[ index - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNextNode-&amp;gt;sum &amp;gt; remainStep)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 向下进入最右侧的最小子节点分支 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            pNextNode = pNextNode-&amp;gt;child[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;];&lt;br /&gt;        }&lt;br /&gt;        pCurNode = pNextNode;&lt;br /&gt;        remainStep -= pCurNode-&amp;gt;sum;                &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pCurNode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; path: 字符串形式例如&amp;ldquo;12301&amp;rdquo; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;PNODE GetNodeByPath(PNODE pRoot, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* path)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = path;&lt;br /&gt;    PNODE pCur = pRoot;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCur-&amp;gt;child[i]-&amp;gt;num == (*p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                pCur = pCur-&amp;gt;child[i];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; pCur;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 借助辅助栈，输出找到的节点的路径（从根节点到该节点）&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputNodePath(PNODE pNode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; stack[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; top = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    PNODE pCur = pNode;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur-&amp;gt;parent != NULL)&lt;br /&gt;    {&lt;br /&gt;        stack[top++] = pCur-&amp;gt;num;&lt;br /&gt;        pCur = pCur-&amp;gt;parent;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(top &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, stack[ top - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ]);&lt;br /&gt;        --top;&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth, step;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; path[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    PNODE pRoot, pStart, pDest;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;depth, &amp;amp;step) != EOF)&lt;br /&gt;    {&lt;br /&gt;        gets(path);&lt;br /&gt;        pRoot = CreateTree(depth);&lt;br /&gt;        pStart = GetNodeByPath(pRoot, path);&lt;br /&gt;        pDest = GetNodeBySteps(pRoot, pStart, step);&lt;br /&gt;        OutputNodePath(pDest);&lt;br /&gt;        FreeTree(pRoot);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;【分析】为什么算法（2）比算法（1）快？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;算法（1）永远是一个一个数字向前数，步进值（step）永远为 1 ; 当初我想改进算法（1）时发现，如果不借助数据结构，很难在原基础上进行改进。集合中的数也很难用数学公式计算或总结（这也是采用模拟法的原因）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;算法（2）是在树中导航，注意树节点越往上（深度越小），节点的 sum 值越大（而且是随着深度减小，以极快的指数速度增长），所以算法（2）的数数方式是跳跃式的，而且能用很快速度探索到一个理想的 Step 值（该 Step 足够大，又满足 Step &amp;lt;= K ，即向目标迈进的步子足够大，而又不会超越目标节点），该 Step 由树节点的 sum 值表示，然后直接越过该子树所代表的子集合，无需遍历该子集合（所有数字或树节点）。因此访问的节点在树中的深度越浅（越靠近树根），则以该节点为根的子树的规模就越大，代表着跨越的数字个数就越多。由于每个节点最多只有两个哥哥节点，在同一深度向前移动时所消耗的时间不多，因此算法能以很快的速度上升到跨度尽可能大的可访问节点。因此算法（2）在时间上比算法（1）高效的多。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;算法（2）的另一种形象理解是：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;B &amp;gt; A，则水平方向 B 位于 A 子树的下方或 A 的右侧子树。则存在一个深度最大（设深度为 d ）的公共子树 T ，满足 A, B &amp;isin; T 。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;现在从节点 B 出发，寻找节点 A。由于 A 比 B 小，因此 B 不可能是 T 的根。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #800080;"&gt;(a). 如果 A&amp;nbsp;不是 T 的根，则必然 A 和 B 分别位于 T 的左右两个子树。因此从 B 所在的右侧子树上浮到 （d+1） 深度后，继续向前移动到 A 所在的左侧子树，然后靠右侧下沉到&amp;nbsp;A 。（搜寻路线类似梯形）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;(b). 如果 A&amp;nbsp;是 T 的根，则靠左上浮到 A 。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;上诉两种情况，在水平方向上在各个深度上都可能呈现一些向左的水平步进。因此在 &lt;strong&gt;&lt;span style="color: #0000ff;"&gt;向前向上 &lt;/span&gt;探寻时，探寻路径呈&amp;ldquo;锯齿形&amp;rdquo;。&lt;span style="color: #0000ff;"&gt;向下&lt;/span&gt;探寻时则是&amp;ldquo;直线&amp;rdquo;式下降。&lt;/strong&gt;对平均情况，探索路径的长度（时间）和树的高度 N 为线性关系。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111011573432.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Figure 1. 节点 B 到节点 A 的探寻路径；&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;如 Figure 1 所示。图中红色虚线箭头相连得到的路径，即为从 B 到 A 的探寻路径。图中 A 和 B 的最深公共子树 T 是数字&amp;ldquo;10&amp;rdquo;所在节点，同时 T 被用粗线表示。灰色节点为可访问节点，斜线表示的节点为位于搜索路线上，但是被经过（Pass）的节点。图中 N = K = 4；从 A 到 B 的序列是：{ &lt;span style="color: #ff0000;"&gt;1021&lt;/span&gt;, 1023, 103, 1030, &lt;span style="color: #0000ff;"&gt;1031&lt;/span&gt; } ;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;【缺陷】但算法（2）的结果是内存超出限制（MLE）。理由实际上同（1），当 N 很大时，树非常庞大。由于它是一个满三叉树，所以节点数量是一个等比数列的和：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;strong&gt;Sum&lt;/strong&gt;&amp;nbsp; = &amp;nbsp;&lt;strong&gt;&amp;sum;&lt;/strong&gt; &lt;span style="color: #800080;"&gt;( 3 ^&amp;nbsp;i )&lt;/span&gt;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1 + 3 + 9 + 27 + ... + 3^N&lt;/span&gt;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;( 3 ^ ( N + 1) - 1 ) / 2 &lt;/span&gt;;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #800080;"&gt;&lt;em&gt;&lt;/em&gt;&lt;span style="color: #008000;"&gt;----( 高度为 N + 1&amp;nbsp;的三叉树的所有节点数量 ) ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;从上式粗略估算可知内存需求极大，产生 MLE 也就不足为奇了，&lt;/span&gt;&lt;span class="bigProblemTitle"&gt;考虑极限情况：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;strong&gt;假设 N = &lt;span style="color: #0000ff;"&gt;19&lt;/span&gt;，则此树共含有 &lt;span style="color: #ff0000;"&gt;1,743,392,200&lt;/span&gt; 个节点。&lt;/strong&gt;设每个节点占用 24 Bytes 则：&lt;strong&gt;在内存中建立该树需要：&lt;span style="color: #ff0000;"&gt;38.97 GB ！！！ &lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="color: #000000;"&gt;@_@ ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;（1）和（2）的解法一个超时一个超内存限制，都是因为该集合的元素数量非常大导致的。既要利用（2）中的三叉树模型的时间效率，但又不能采用在内存中完整建立树的方法，因此导出下面的第三个解法。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（3）正确解：虚拟树 / 树枝法（Result：AC）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;为了时间效率，依然采用三叉树的模型，但是不能在内存中完整建树，因此启发我们，可以在内存中仅仅保留一条树枝，该树枝最长的长度（叶子在树中所处的深度）为 N。考察解法（2）中的方法，无非是在树之间进行导航，即从某个节点到其父节点，左侧的哥哥节点，右下方的幼子节点。同时，由于此树满足，相同深度的所有节点的 sum 值相同。因此我们可以仅用一条树枝即完成（2）中的算法。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;方法是：&lt;span style="color: #800080;"&gt;在内存中不建立整个树，而是仅仅存储一个当前树枝。&lt;/span&gt;树枝长度可伸缩，最大为N。树枝采用一个线性表结构保存，可以使用数组或链表（为了代码简便我们使用数组）。每个节点依然含有两个属性： num 和 sum。如果说算法（2）中的树是内存中的实际树（物理树），则算法（3）中的树是仅存在于思维模型中的&amp;ldquo;虚拟树&amp;rdquo;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;一个树枝在树中的位置，以及它在数组中的存储状态如下图所示，图中树枝部分用实体粗线条表示，整个树由于不在内存中，因此用虚线表示：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111003590461.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;为了实现算法，我们必须很容易的确定该树枝在完整的树模型中的位置和形态。即容易实现以下问题：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle"&gt;&lt;span style="color: #800080;"&gt;（3.1）求出某个节点在同辈兄弟中的排行索引（ Index_In_Siblings ） ，&amp;isin; { 0，1，2 } ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;&lt;span class="bigProblemTitle"&gt;（3.2）求出某个节点的哥哥节点（左侧）的 num （ Num_Of_Elder_Brother ），&amp;isin; { 0，1，2，3 } ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #800080;"&gt;（3.3）求出某个节点的幼子节点（右下）的 num （ Num_Of_Right_Child ），&amp;isin; { 0，1，2，3 } ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;其中（3.1）和（3.2）可以通过本节点的 num 和其父节点的 num 推断得出。（3.3）可以从本节点的 num 求出。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;算法执行过程中，随着游标在树中的节点之间移动，树枝在树中的伸展形态（在树中的位置和树枝的长度）也同时发生变化，当寻找到目标节点 A 以后，树枝静止在最终状态，根据方法返回的树枝长度即可确定最终的树枝。目标节点 A 即为最终树枝的末端叶子节点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;因此解法（3）三叉树树枝法算法与（2）相同，但解决了空间复杂度的问题，代码如下：&amp;nbsp;&lt;span style="color: #ccffcc;"&gt;&lt;span style="background-color: #ccffcc; color: #339966;"&gt; ( &lt;span style="background-color: #ccffcc; color: #339966;"&gt;&amp;radic;. &lt;/span&gt;以下代码是可接受的&amp;nbsp;) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('cc0d495f-49e1-4579-9f88-fe801dfc2d2d')"&gt;&lt;div id="cnblogs_code_open_cc0d495f-49e1-4579-9f88-fe801dfc2d2d" class="cnblogs_code_hide"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _NODE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; num;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点数字, 取值 0,1,2,3 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; sum;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 + 3 + 9 + ... + 3^k &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;} NODE, *PNODE;&lt;br /&gt;&lt;br /&gt;NODE nodes[&lt;span style="color: #800080;"&gt;20&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;树枝&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化树枝各个节点的 sum 值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; InitSums(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;叶子节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     nodes[N-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].sum = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = N - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;; i &amp;gt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt; ; --i)&lt;br /&gt;    {&lt;br /&gt;        nodes[i].sum = nodes[i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].sum * &lt;span style="color: #800080;"&gt;3&lt;/span&gt; + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化树枝各个节点的 num 值&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;path: "1231"&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; InitNodesByPath(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *path)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = path;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        nodes[depth].num = (*p - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;        ++depth;&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; depth - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;输出指定深度节点的路径（从根节点到该节点）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputNodePath(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt;= depth; i++)&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, nodes[i].num);&lt;br /&gt;    }&lt;br /&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取节点在兄弟节点中的排行索引&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetIndexInSibling(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(depth == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nodes[depth-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num &amp;gt; nodes[depth].num)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; nodes[depth].num;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回哥哥节点的数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetBrother(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = nodes[depth].num - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(depth &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; nodes[depth-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num == result)&lt;br /&gt;    {&lt;br /&gt;        --result;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回幼子的数字&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetRightChild(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(nodes[depth].num == &lt;span style="color: #800080;"&gt;3&lt;/span&gt;)&lt;br /&gt;        result = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;从节点A开始向前追溯到节点B，返回对应深度&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;nStart: 节点A的深度&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;step：节点A和B之间的距离&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetNodeBySteps(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStart, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStep)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; remainStep = nStep;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; depth = nStart;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(remainStep &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;回退到父节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(GetIndexInSibling(depth) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向上返回一层时，只-1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            depth--;&lt;br /&gt;            remainStep--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;进入哥哥节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         nodes[depth].num = GetBrother(depth);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(nodes[depth].sum &amp;gt; remainStep)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向下进入最右侧的最小子节点分支&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              nodes[depth + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].num = GetRightChild(depth);&lt;br /&gt;            depth++;&lt;br /&gt;        }&lt;br /&gt;        remainStep -= nodes[depth].sum;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; depth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; N, K;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; path[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nStart, nDest;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;N, &amp;amp;K) != EOF)&lt;br /&gt;    {&lt;br /&gt;        gets(path);&lt;br /&gt;        InitSums(N);&lt;br /&gt;        nStart = InitNodesByPath(path);&lt;br /&gt;        nDest = GetNodeBySteps(nStart, K);&lt;br /&gt;        OutputNodePath(nDest);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;以上代码提交后的结果是 AC。运行消耗是时间 120 ms，空间 180 KB。空间需求微不足道可以说是O（1），但用时是解排行榜单上的其他 C++ 优秀解法用时（40ms ~ 60ms）的两三倍。一可能是我用了很多很小的函数，没有inline，多少带来一些函数调用的开销，二是可能别人的算法要比我更快更好。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;【分析】为什么可以使用树枝的方法？&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;此题目中，树的规模非常大，所以逼迫我们使用了树枝法，那么为什么可以不在内存中建立树呢，这是因为树自身具有的内在规律，即节点不是完全随机和独立的，而是存在下面的关系，假设树根深度为 1，树的高度（叶子节点的深度）为（N + 1），则&lt;/span&gt;&lt;/span&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;深度为 d 的节点：Node.sum = ( 3 ^ (N +&amp;nbsp;2 - d ) - 1 ) / 2;&amp;nbsp; 对于非叶子节点，有三个子节点，按升序排列并与父节点不重复。因为有了这些已知条件，使我们能推断出我们需要的节点的信息，因此不需要一个完整的树来存储它。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="bigProblemTitle" style="color: #0000ff;"&gt;&lt;span style="color: #000000;"&gt;【说明】本文所有插图，使用 Microsoft Office Visio 绘制。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2243839.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/10/2243839.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html</id><title type="text">ZOL 简单题集合（二）</title><summary type="text">ZOL 简单题集合之二。</summary><published>2011-11-08T19:59:00Z</published><updated>2011-11-08T19:59:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html"/><content type="html">&lt;p&gt;对以下简单题，我同时给出一个我主观认为的难度值（0.1~1.0之间）。&lt;/p&gt;&lt;p&gt;(1). ZOL1072: Microprocessor Simulation. (Difficulty: 0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1072"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1072&lt;/a&gt;&lt;/p&gt;&lt;p&gt;微处理器模拟，它含有两个累加器，代码和内存统一寻址，即冯诺依曼结构，比较简单。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('94d41302-021e-4227-ae1b-2fae132d003c')"&gt;&lt;div id="cnblogs_code_open_94d41302-021e-4227-ae1b-2fae132d003c" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; mem[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 256 words 内存 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; A;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; A 累加器 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; B;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; B 累加器 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PC;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;程序计数器，code取址用&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Run()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; flag_STOP = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; code, addr;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; tmp;&lt;br /&gt;    PC = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; reset PC &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(PC &amp;gt;= &lt;span style="color: #800080;"&gt;0xF0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 取指令 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        code = mem[PC];&lt;br /&gt;        ++PC;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;(code)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; LD: Load accumulator A with the contents of memory &lt;br /&gt;               at the specified argument.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;: &lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            A = mem[addr];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; ST: Write the contents of accumulator A to the memory&lt;br /&gt;               location specified by the argument.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            mem[addr] = A;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; SWP: Swap the contents of accumulators A and B. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;:&lt;br /&gt;            tmp = A;&lt;br /&gt;            A = B;&lt;br /&gt;            B = tmp;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; ADD: Add the contents of accumulators A and B. The &lt;br /&gt;               low word of the sum is stored in A, and the high &lt;br /&gt;               word in B. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;:&lt;br /&gt;            tmp = A + B;&lt;br /&gt;            A = (tmp &amp;amp; &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;);&lt;br /&gt;            B = (tmp &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; INC: Increment accumulator A. Overflow is allowed; &lt;br /&gt;               that is, incrementing F yields 0. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;:&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;) A = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; A++;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; DEC: Decrement accumulator A. Underflow is allowed; &lt;br /&gt;               that is, decrementing 0 yields F.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;:&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) A = &lt;span style="color: #800080;"&gt;0x0F&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; A--;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; BZ: If accumulator A is zero, the next command to be &lt;br /&gt;               executed is at the location specified by the argument. &lt;br /&gt;               If A is not zero, the argument is ignored and nothing &lt;br /&gt;               happens. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC += &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(A == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                PC = addr;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; BR: The next command to be executed is at the location &lt;br /&gt;               specified by the argument. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;7&lt;/span&gt;:&lt;br /&gt;            addr = mem[PC] * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; + mem[PC+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            PC = addr;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; STP: Stop execution of the program. &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;:&lt;br /&gt;            flag_STOP = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(!flag_STOP);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; CharToNum(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800080;"&gt;10&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; NumToChar(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800080;"&gt;9&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800080;"&gt;10&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;264&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 读取一次完整的输入 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; strlen(line); j++)&lt;br /&gt;            {&lt;br /&gt;                mem[i] = CharToNum(line[j]);&lt;br /&gt;                i++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(i &amp;lt; &lt;span style="color: #800080;"&gt;256&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;结束输入的标志&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(mem[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;8&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        Run();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; output &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;256&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, NumToChar(mem[j]));&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(2). ZOL1414: Num Steps. (Difficulty: 0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1414"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1414&lt;/a&gt;&lt;/p&gt;&lt;p&gt;一个网格如下图所示，给出一个坐标（x，y），要求输出其数字，如果没有数字则输出 "No Number&amp;rdquo;;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22214/2011111406080629.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('a11a0a59-58a4-4b6c-a053-f513a2490351')"&gt;&lt;div id="cnblogs_code_open_a11a0a59-58a4-4b6c-a053-f513a2490351" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x, y, num;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x, &amp;amp;y);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x - y == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; || x - y == &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            num = ((x &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;) + (x &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) - (x - y);&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, num);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No Number\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(3). ZOL1170: String Matching. (0.3)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1170"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1170&lt;/a&gt;&lt;/p&gt;&lt;p&gt;求出两个字符串的相似值（一个化简后的分数）。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('b8f9b91f-215f-475c-b28f-0a97fd5e5bd5')"&gt;&lt;div id="cnblogs_code_open_b8f9b91f-215f-475c-b28f-0a97fd5e5bd5" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; szLine[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到两个字符串的相同字符个数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; SameLetterCount(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s1, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p1 = s1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p2 = s2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p1 &amp;amp;&amp;amp; *p2)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*p1 == *p2) count++;&lt;br /&gt;        ++p1;&lt;br /&gt;        ++p2;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;此方法的时间复杂度应该是O(n ^ 2)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetAppx(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s1, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s2, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* pAppx, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* pTotalLen)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, tmp_appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, index;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len1 = strlen(s1);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len2 = strlen(s2);&lt;br /&gt;&lt;br /&gt;    *pTotalLen = len1 + len2;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(s1, s2) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        *pAppx = *pTotalLen;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(index = -(len2 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;); index &amp;lt;= len1 - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; ++index)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            tmp_appx = SameLetterCount(s1, s2 - index);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            tmp_appx = SameLetterCount(s2, s1 + index);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(tmp_appx &amp;gt; appx)&lt;br /&gt;            appx = tmp_appx;&lt;br /&gt;    }&lt;br /&gt;    *pAppx = appx * &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 辗转相除法，求最大公约数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetGcd(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; tmp;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(b &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        tmp = a % b;&lt;br /&gt;        a = b;&lt;br /&gt;        b = tmp;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* pBlank = NULL;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; totalLen = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, appx = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, gcd = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        gets(szLine);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(strcmp(szLine, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在空格处截断字符串&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;         pBlank = strchr(szLine, &lt;span style="color: #800000;"&gt;' &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;        *pBlank = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;        GetAppx(szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &amp;amp;appx, &amp;amp;totalLen);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(appx == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = 0\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(appx == totalLen)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = 1\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;化简分数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              gcd = GetGcd(totalLen, appx);&lt;br /&gt;            totalLen /= gcd;&lt;br /&gt;            appx /= gcd;&lt;br /&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appx(%s,%s) = %d/%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;br /&gt;                szLine, pBlank + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, appx, totalLen);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(4). ZOL1240: IBM Minus One (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1240"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1240&lt;/a&gt;&lt;/p&gt;&lt;p&gt;超级简单，把字符串中每个字符用其字母序后面的字符替换。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('67a92deb-1937-4e39-b7a7-79300861dbe6')"&gt;&lt;div id="cnblogs_code_open_67a92deb-1937-4e39-b7a7-79300861dbe6" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把每个字母向后旋转一格，c = c + 1, Z-&amp;gt;A&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Transfer(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* p = s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*p == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) *p = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; *p = *p + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        ++p;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;56&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i;&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        Transfer(line);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;String #%d\n%s\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, line);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(5) ZOL1295: Reverse Text (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1295"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1295&lt;/a&gt;&lt;/p&gt;&lt;p&gt;反转字符串，即 CRT 中的 strrev。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3ac6ec16-7d62-4581-8d5b-3b1affe382d8')"&gt;&lt;div id="cnblogs_code_open_3ac6ec16-7d62-4581-8d5b-3b1affe382d8" class="cnblogs_code_hide"&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; reverse(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* str)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; tmp;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right = strlen(str) - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(left &amp;lt; right)&lt;br /&gt;   {&lt;br /&gt;       tmp = str[left];&lt;br /&gt;       str[left] = str[right];&lt;br /&gt;       str[right] = tmp;&lt;br /&gt;       ++left;&lt;br /&gt;       --right;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; str[&lt;span style="color: #800080;"&gt;256&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;n; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(str);&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;scanf("%s", str);&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        reverse(str);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, str);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(6). ZOL1383: Binary Numbers (0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1383"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1383&lt;/a&gt;&lt;/p&gt;&lt;p&gt;输出一个数字二进制表示中 1 所在的位。（注意输出格式）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c2b4d6db-8403-477e-892f-a27b74c599c6')"&gt;&lt;div id="cnblogs_code_open_c2b4d6db-8403-477e-892f-a27b74c599c6" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i, num, iDigit;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否需要在该位前输出一个空格&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bNeedSpace;&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;num);&lt;br /&gt;        iDigit = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        bNeedSpace = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(num != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(num &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bNeedSpace) printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, iDigit);&lt;br /&gt;                bNeedSpace = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            num = (num &amp;gt;&amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;            ++iDigit;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(7). ZOL1814: Candy Sharing Game (0.2)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1814"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1814&lt;/a&gt;&lt;/p&gt;&lt;p&gt;分糖果游戏，学生围成一圈，每次把手里的一半糖果分给右侧的人，如果任何人糖果为奇数，则再分给他一颗，直到所有人持有糖果数相同。模拟法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4f4d518f-1541-4f06-872d-a045ddd6eecb')"&gt;&lt;div id="cnblogs_code_open_4f4d518f-1541-4f06-872d-a045ddd6eecb" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;students: 每个学生持有的糖果数（逆时针方向）&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;n: 学生个数&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;rounds：游戏轮次&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;candy：游戏结束时每个学生手里的糖果数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Play(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* students, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* rounds, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;* candy)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, students0, tmp_candy, left_candy;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bGameOver;&lt;br /&gt;    *rounds = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        students0 = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;];&lt;br /&gt;        bGameOver = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;        {&lt;br /&gt;            left_candy = (i == (n-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;))? students0 : students[i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;];&lt;br /&gt;            students[i] = (students[i] + left_candy)/&lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果是奇数，立即再给他一个糖果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(students[i] &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                students[i]++;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                tmp_candy = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bGameOver &amp;amp;&amp;amp; students[i] != tmp_candy)&lt;br /&gt;            {&lt;br /&gt;                bGameOver = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        (*rounds)++;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bGameOver) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;最终结果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    *candy = students[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; students[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; rounds, candy;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;n; i++)&lt;br /&gt;            scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, (students + i));&lt;br /&gt;&lt;br /&gt;        Play(students, n, &amp;amp;rounds, &amp;amp;candy);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, rounds, candy);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(8). ZOL2680: Clock (0.3)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2680"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2680&lt;/a&gt;&lt;br /&gt;给出 5 个时刻，按时钟的时针，分针夹角从小到大排序，输出中间的时刻。显然，整数分钟（不考虑秒）时刻，时针分针的夹角是 0.5 角度的整数倍，因此为回避浮点数，采用 0.5 度为指针夹角的基本单位（一个圆周为 360 度）。由于需要输出的只是排序后的中间元素，排序时只要排好一半即可。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('25473b66-5f83-4d94-bd45-ba6914f5d35b')"&gt;&lt;div id="cnblogs_code_open_25473b66-5f83-4d94-bd45-ba6914f5d35b" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; tagTime&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; angle; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;夹角以0.5度为单位&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; minute;&lt;br /&gt;} TIME;&lt;br /&gt;&lt;br /&gt;typedef TIME Item;&lt;br /&gt;&lt;br /&gt;Item items[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; lessthan(Item t1, Item t2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;     (t1.angle &amp;lt; t2.angle) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.angle &amp;gt; t2.angle) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.hour &amp;lt; t2.hour) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.hour &amp;gt; t2.hour) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(t1.minute &amp;lt; t2.minute) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;交换a[]的i，j项&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; exchange(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _angle = a[i].angle;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _hour = a[i].hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _minute = a[i].minute;&lt;br /&gt;&lt;br /&gt;    a[i].angle = a[j].angle;&lt;br /&gt;    a[i].hour = a[j].hour;&lt;br /&gt;    a[i].minute = a[j].minute;&lt;br /&gt;&lt;br /&gt;    a[j].angle = _angle;&lt;br /&gt;    a[j].hour = _hour;&lt;br /&gt;    a[j].minute = _minute;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;选择排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; stopIndex: 当排序到索引stopIndex，即可停止排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SelectionSort(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; stopIndex)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, min;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;for(i = left; i &amp;lt; right; i++) //完整排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt;= stopIndex; i++)&lt;br /&gt;    {&lt;br /&gt;        min = i;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt;= right; j++)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(lessthan(a[j], a[min])) min = j;&lt;br /&gt;        exchange(a, i, min);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//以 &lt;/span&gt;&lt;span style="color: #008000;"&gt;0.5度 为单位（eg. 180 units = 90 度，720 units = 360 度）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetAngle(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; minute)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hour2 = (hour &amp;gt; &lt;span style="color: #800080;"&gt;12&lt;/span&gt;) ? (hour - &lt;span style="color: #800080;"&gt;12&lt;/span&gt;) : hour;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a1 = &lt;span style="color: #800080;"&gt;60&lt;/span&gt; * hour2 + minute;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a2 = minute * &lt;span style="color: #800080;"&gt;12&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = a2 - a1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;        result = -result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;gt; &lt;span style="color: #800080;"&gt;360&lt;/span&gt;)&lt;br /&gt;        result = &lt;span style="color: #800080;"&gt;720&lt;/span&gt; - result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, count;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;];&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            items[j].hour = ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; ) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br /&gt;                + ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; );&lt;br /&gt;            items[j].minute = ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt; + &lt;span style="color: #800080;"&gt;3&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; ) * &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br /&gt;                + ( line[j*&lt;span style="color: #800080;"&gt;6&lt;/span&gt;+&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; );&lt;br /&gt;            items[j].angle = GetAngle(items[j].hour, items[j].minute);&lt;br /&gt;        }&lt;br /&gt;        SelectionSort(items, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%02d:%02d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, items[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;].hour, items[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;].minute);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;(9). ZOL3191: Strange Clock (0.2)&lt;br /&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3191"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3191&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出时针的角度，输出该时刻处于几点钟。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('33e59efa-002e-4da2-a10e-9f821edba932')"&gt;&lt;div id="cnblogs_code_open_33e59efa-002e-4da2-a10e-9f821edba932" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; hourBig, hourSmall;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bExactly; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注意 gcc 没有定义过 bool 类型&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; degree;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;degree);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(degree == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        bExactly = (degree - (degree / &lt;span style="color: #800080;"&gt;30&lt;/span&gt; * &lt;span style="color: #800080;"&gt;30&lt;/span&gt;) == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;        hourBig = (degree &amp;lt; &lt;span style="color: #800080;"&gt;120&lt;/span&gt; ? &lt;span style="color: #800080;"&gt;3&lt;/span&gt; : &lt;span style="color: #800080;"&gt;15&lt;/span&gt;) - (degree / &lt;span style="color: #800080;"&gt;30&lt;/span&gt;);&lt;br /&gt;        hourSmall = (hourBig == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) ? &lt;span style="color: #800080;"&gt;11&lt;/span&gt; : (hourBig - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bExactly)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Exactly %d o'clock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hourBig);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Between %d o'clock and %d o'clock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, hourSmall, hourBig);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(10). ZOL3247: Hello World (0.3)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3247"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3247&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出一个点阵，要求输出字符图形（每一行输入由 5 个字节组成，代表一个字符，每个字节代表该字符的一列，即每个字符实际上7 * 5 像素，注意行和 bit 之间的对应关系，低位对应的是上方像素，高位对应下方像素，所有字节的最高位为 0，表示最后一行没有任何像素，注意最后一行不能输出一长串空格，而是要输出成空行即直接换行，否则将导致 PE），备注：可使用 strtol 把16进制字符串转换成整数。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e27cfd3e-e37b-45f8-981a-5f6ade39ff5e')"&gt;&lt;div id="cnblogs_code_open_e27cfd3e-e37b-45f8-981a-5f6ade39ff5e" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;80&lt;/span&gt;][&lt;span style="color: #800080;"&gt;5&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; CharToInt(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;F&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (c + &lt;span style="color: #800080;"&gt;10&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;24&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; test_count, char_count, i, j, k, col;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;test_count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt;= test_count; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;char_count);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; char_count; j++)&lt;br /&gt;        {&lt;br /&gt;            gets(line);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(k = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; k &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; k++)&lt;br /&gt;            {&lt;br /&gt;                map[j][k] = CharToInt( line[k*&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] ) * &lt;span style="color: #800080;"&gt;16&lt;/span&gt; &lt;br /&gt;                    + CharToInt( line[k*&lt;span style="color: #800080;"&gt;3&lt;/span&gt;+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] );&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;output the string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Case %d:\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, i);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;j: rows index&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;; j++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j &amp;lt; &lt;span style="color: #800080;"&gt;7&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(k = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; k &amp;lt; char_count; k++)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;输出一个字符的某一行（五列）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(col = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; col &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; col++)&lt;br /&gt;                     {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( map[k][col] &amp;amp; (&lt;span style="color: #800080;"&gt;1 &lt;/span&gt;&amp;lt;&amp;lt; j) )&lt;br /&gt;                            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                            printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                      }&lt;br /&gt;                      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符和字符之间的空列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(k &amp;lt; char_count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                 }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一行结束，换行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;              printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(11). ZOL3322: Who is older ? (0.1)&lt;br /&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3322"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3322&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出两个人的生日，比较年龄谁大，超级简单，直接比较字符串即可。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('45deb09a-ea76-4d2d-9fee-f494e79d162d')"&gt;&lt;div id="cnblogs_code_open_45deb09a-ea76-4d2d-9fee-f494e79d162d" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;36&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, result;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        line[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        result = strcmp(line, line + &lt;span style="color: #800080;"&gt;11&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javaman\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;cpcs\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;same\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(12). ZOL3487: Ordinal Numbers (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3487"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3487&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出一个数字，根据规则，给出其序数后缀表示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('da91427d-553a-4435-b4f1-6559ce1d80c1')"&gt;&lt;div id="cnblogs_code_open_da91427d-553a-4435-b4f1-6559ce1d80c1" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetPostfix(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* line, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* postfix)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len = strlen(line);&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;十位上的字符&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(len &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        c = line[len-&lt;span style="color: #800080;"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the tens digit of a number is 1, then write&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"th" after the number. For example: 13th, 19th, 112th, 9311th. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;th&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;If the tens digit is not equal to 1, then use&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"st" if the units digit is 1, &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"nd" if the units digit is 2, &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"rd" if the units digit is 3, and &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;"th" otherwise: &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;For example: 2nd, 7th, 20th, 23rd, 52nd, 135th, 301st. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;(line[len-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&lt;br /&gt;        {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;st&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;2&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;3&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;: strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:  strcpy(postfix, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;th&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, i;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;48&lt;/span&gt;], postfix[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;count);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        gets(line);&lt;br /&gt;        GetPostfix(line, postfix);&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line, postfix);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(13). ZOL3542: Hexadecimal View (0.1)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3542"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3542&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出一行字符串（全部是可打印字符），输出 16 进制视图。备注：字符大小写的互相转换也可使用 touppder / tolower 。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('d1e8ac15-5b7d-4361-bfdd-50f64c5722ff')"&gt;&lt;div id="cnblogs_code_open_d1e8ac15-5b7d-4361-bfdd-50f64c5722ff" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OutputHexView(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* s)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, linenum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; len = strlen(s);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; linecount = (len + &lt;span style="color: #800080;"&gt;15&lt;/span&gt;)/&lt;span style="color: #800080;"&gt;16&lt;/span&gt;;  &lt;span style="color: #008000;"&gt;//需要打印的总行数&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(linenum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; linenum &amp;lt; linecount; ++linenum)&lt;br /&gt;    {&lt;br /&gt;        memset(line, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;16&lt;/span&gt;);&lt;br /&gt;        strncpy(line, p, &lt;span style="color: #800080;"&gt;16&lt;/span&gt;);&lt;br /&gt;        p += &lt;span style="color: #800080;"&gt;16&lt;/span&gt;;&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%04x: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, (linenum &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;) &amp;amp; &lt;span style="color: #800080;"&gt;0xffff&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"  &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;//没有字符（最后一行的 padding 部分）&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%02x&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;amp; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) &lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;//每两个字符之间有一个空格间隔&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; line[i] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #008000;"&gt;// islower( line[i] )&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i] + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);    &lt;span style="color: #008000;"&gt;// toupper( line[i] )&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(line[i] &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; line[i] &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i] + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; - &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);   &lt;span style="color: #008000;"&gt;// tolower;&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, line[i]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; line[&lt;span style="color: #800080;"&gt;4100&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( gets(line) != NULL )&lt;br /&gt;    {&lt;br /&gt;        OutputHexView(line);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(14). ZOL3317: Murder in Restaurant (0.3)&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3317"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3317&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出一个旅馆的入住信息表，客人数和房间数，给出每个客人的试图入住日期和离店日期（都用整数表示），尝试给客人分配一个最小房号（从1开始计数）的房间，要求输出每个客人的入住房号，如果该客人来时没有房间则输出 0。&lt;/p&gt;&lt;p&gt;解法：把客人按照入住时间升序排序，然后依次分配房间号。（有些类似贪心法中的申请会议室）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('9f4dad45-d774-4543-84c4-d8decd0f33c9')"&gt;&lt;div id="cnblogs_code_open_9f4dad45-d774-4543-84c4-d8decd0f33c9" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Rooms_Leave[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];      &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 每个元素表示第 i 个房间退房的日期 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Renters_RoomNo[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 每个元素分配给第 i 个客人的房间号 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; tagRENTER&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;客人索引（0 base）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; EnterDate; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;入住日期&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; LeaveDate; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;离店日期&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;} RENTER, *PRENTER;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;typedef&lt;/span&gt; RENTER Item;&lt;br /&gt;&lt;br /&gt;Item items[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; less_than(Item t1, Item t2)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (t1.EnterDate &amp;lt; t2.EnterDate) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;交换a[]的i，j项&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; exchange(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i != j)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _index = a[i].index;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _EnterDate = a[i].EnterDate;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _LeaveDate = a[i].LeaveDate;&lt;br /&gt;&lt;br /&gt;        a[i].index = a[j].index;&lt;br /&gt;        a[i].EnterDate = a[j].EnterDate;&lt;br /&gt;        a[i].LeaveDate = a[j].LeaveDate;&lt;br /&gt;&lt;br /&gt;        a[j].index = _index;&lt;br /&gt;        a[j].EnterDate = _EnterDate;&lt;br /&gt;        a[j].LeaveDate = _LeaveDate;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;选择排序&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SelectionSort(Item a[], &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; left, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; right)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, j, min;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = left; i &amp;lt; right; i++)&lt;br /&gt;    {&lt;br /&gt;        min = i;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = i + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; j &amp;lt;= right; j++)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(less_than(a[j], a[min])) min = j;&lt;br /&gt;        exchange(a, i, min);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; renter_count, room_count, i, j;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;( &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;renter_count, &amp;amp;room_count);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(renter_count == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            Rooms_Leave[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            Renters_RoomNo[i] = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            items[i].index = i;&lt;br /&gt;            scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;items[i].EnterDate, &amp;amp;items[i].LeaveDate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 给每个客人分配房间 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        SelectionSort(items, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, renter_count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; room_count; j++)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Rooms_Leave[j] &amp;lt;= items[i].EnterDate)&lt;br /&gt;                {&lt;br /&gt;                    Rooms_Leave[j] = items[i].LeaveDate;&lt;br /&gt;                    Renters_RoomNo[ items[i].index ] = j + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; output result &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; renter_count; i++)&lt;br /&gt;        {&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Renters_RoomNo[i]);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(15). ZOL2850: Beautiful Meadow ( 0.1 )&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2850"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2850&lt;/a&gt;&lt;/p&gt;&lt;p&gt;给出一个 N * M 的网格，每个 cell 的值是 0&amp;nbsp;或 1。如果所有 cell 都是1，或有任何为 0 的 cell 相邻（即共享某条边），则输出No，否则输出Yes。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e98b9745-63c5-4ee5-b407-dc417f128d85')"&gt;&lt;div id="cnblogs_code_open_e98b9745-63c5-4ee5-b407-dc417f128d85" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, col, i, j, tmp, sum;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bMowedAdjacent;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; map[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;][&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;row, &amp;amp;col);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(row == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        bMowedAdjacent = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        sum = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; row; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; col; j++)&lt;br /&gt;            {&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;tmp);&lt;br /&gt;                map[i][j] = tmp;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(tmp == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(j &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[i][j-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                        bMowedAdjacent = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; map[i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;][j] == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                        bMowedAdjacent = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                    sum += tmp;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(bMowedAdjacent || sum == row * col) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Yes\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(16). ZOL1094: Matrix Chain Multiplication ( 0.3 )&lt;/p&gt;&lt;p&gt;&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094&lt;/a&gt;&lt;/p&gt;&lt;p&gt;虽然题目是算法经典命题-矩阵乘法链，但是此题目考察的绝不是动态规划（DP），而是给出一个矩阵乘法加括号的表达式，求该方案所需的乘法运算数。如果矩阵乘法不相容，则输出 "error"。此题目的输入非常标准，无需考虑表达式的括号不匹配等问题。也无需考虑例如 "ABC" 这种没有加括号的表达式（输入一定给出的是 "((AB)C)" ）。如果是只有单个矩阵，则一定没有括号。这种输入的标准化使我们无需检测特殊情况（例如 "(A)", "ABC", ")AB" 等），可以仅仅用表达式中的括号去推动表达式的解析。&lt;/p&gt;&lt;p&gt;解法是：准备两个辅助栈，一个装入矩阵信息（操作数），一个装入括号（由于输入表达式一定括号匹配，因此第二个辅助栈实际上不需要，但为了保持逻辑完整性依然保留），每次遇到&amp;ldquo;）&amp;rdquo;符号，则从操作数栈中弹出两个矩阵，如果相容，则累加这两个矩阵相乘的代价，然后把结果信息 (row, col) 再次入栈。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('6a9c40cb-e94e-461c-bddc-21e9541eeec9')"&gt;&lt;div id="cnblogs_code_open_6a9c40cb-e94e-461c-bddc-21e9541eeec9" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _tagMatrixInfo&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; col;&lt;br /&gt;} MatrixInfo;&lt;br /&gt;&lt;br /&gt;MatrixInfo matrix[&lt;span style="color: #800080;"&gt;26&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; szExpression: 形如"(A(BC))"; 返回值：乘法次数，-1 代表不相容 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetResult(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* szExpression)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *p = szExpression;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; c;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; brackets[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;];   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 括号的栈 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pBrackets = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;   &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 栈顶指针 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    MatrixInfo nums[&lt;span style="color: #800080;"&gt;512&lt;/span&gt;]; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 操作数栈 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pNums = -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;       &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 栈顶指针 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row0, col0, row1, col1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回的结果：总乘法次数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(*p)&lt;br /&gt;    {&lt;br /&gt;        c = *p;&lt;br /&gt;        ++p;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c &amp;gt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &amp;amp;&amp;amp; c &amp;lt;= &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Z&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; push in stack &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            ++pNums;&lt;br /&gt;            nums[pNums].row = matrix[c-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].row;&lt;br /&gt;            nums[pNums].col = matrix[c-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].col;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            brackets[++pBrackets] = c;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(c == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从栈中弹出两个操作数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            row0 = nums[pNums - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].row;&lt;br /&gt;            col0 = nums[pNums - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;].col;&lt;br /&gt;            row1 = nums[pNums].row;&lt;br /&gt;            col1 = nums[pNums].col;&lt;br /&gt;            pNums -= &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            pBrackets--; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 弹出一个'(' &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 两个操作数是否相容？ &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(col0 != row1)&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            count += row0 * col0 * col1;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 结果信息 push 到操作数栈中 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            ++pNums;&lt;br /&gt;            nums[pNums].row = row0;&lt;br /&gt;            nums[pNums].col = col1;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n, i, result;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; cNum, line[&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;];&lt;br /&gt;    scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; n; i++)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;cNum);&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d %d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;matrix[cNum-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].row, &amp;amp;matrix[cNum-&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;].col);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(gets(line) != NULL)&lt;br /&gt;    {&lt;br /&gt;        result = GetResult(line);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(result &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, result);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2241914.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/09/2241914.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html</id><title type="text">ZOL1010（Area）解题报告</title><summary type="text">基本题意：此题目给出 n 个点的坐标（xi，yi），要求求出这些点围成的多边形面积。同时要求检测出不合法的多边形（例如非相邻边彼此相交的情况）。</summary><published>2011-11-04T13:17:00Z</published><updated>2011-11-04T13:17:00Z</updated><author><name>hoodlum1980</name><uri>http://www.cnblogs.com/hoodlum1980/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;ZOL 1010. Area.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;题目地址：&lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10"&gt;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010&lt;/a&gt;&lt;/p&gt;&lt;p&gt;基本题意：此题目给出 n 个点的坐标 (xi，yi ) ，要求求出这些点按顺序围成的多边形的面积。同时要求检测出不合法的多边形（例如非相邻边彼此相交的情况）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F1010%2F1010-2.jpg" alt="Figure of ZOL1010" width="152" height="140" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;此题求面积不难，样例很容易就过了，但是提交 10+ 次基本都是 WA ，几乎失去信心。做题最郁闷的就是你不知道问题到底出在什么地方，可能改了很多次都没有试对地方。后来跑到 88 的算法版搜了下，看到别人的代码，然后事后总结实际还是卡在了什么样的多边形是 Impossible 的，这个检测代码没有写好，耐心不够导致。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（1）求面积很简单，类似求某个曲线的区间积分&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;用所有多边形的边和X轴围成的梯形的面积累加起来就可以了。例如某条边 ( P1 - P2 ) 和在它在 x 轴的投影 ( p1' - P2' ) 所围成的梯形面积是：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;S&amp;nbsp;&lt;/strong&gt;[ p1-&amp;gt;p2&amp;nbsp;] = &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( y1 + y2 ) * ( x2 - x1 ) ;&lt;span style="color: #008000;"&gt;----（I）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个式子拆开后就是：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;S &lt;/strong&gt;[ p1-&amp;gt;p2&amp;nbsp;] = &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( &lt;strong&gt;&lt;span style="color: #0000ff;"&gt;-x1 * y1 + x2 * y2&lt;/span&gt; - x1 * y2 + x2 * y1&lt;/strong&gt; ) ;&amp;nbsp; &lt;span style="color: #008000;"&gt;---- ( 注：蓝色部分的 xi * yi 累加后被消掉 )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;由于每个边都被累加一遍，每个点参与了组成边两次（前一条边的终点和后一条边的起始点），所以每个顶点自身坐标的乘积 ( xi * yi ) 累加的时候都被消掉了！最后就是累加所有的式（I）：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Area&lt;/strong&gt; = &lt;strong&gt;&amp;sum;&lt;/strong&gt; &lt;span style="color: #ff0000;"&gt;1/2&lt;/span&gt; * ( -&lt;strong&gt;x( i ) * y( i + 1 )&amp;nbsp; + x( i + 1 ) * y( i )&lt;/strong&gt; ) ;&lt;/p&gt;&lt;p&gt;　&lt;em&gt;　&lt;/em&gt;&lt;span style="color: #008000;"&gt;----( i = 1,2,...,n，且P(n+1) = P(0) ); ----（II）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上面的式子，括号内是两个矢量的叉积&amp;nbsp;P[ i + 1 ] &amp;times; P[ i ]。因此式II实际上是依次累加相邻点的叉积，最后在除以2。考虑叉积的含义，是以两个矢量为相邻边的平行四边形（由 O(0,0), P1, P2, (P1 + P2) 四个点组成）的面积（在平面坐标中用三角形面积相减可以很容易推导出该含义），因此这个方法的物理意义就非常明显了，我们可以直观的假定原点位于多边形内部，显然依次把相邻点和原点围成的三角形的面积累加起来就是这些点组成的多边形的面积。因此 1/2 ( P[ i + 1&amp;nbsp;] X P[ i ] ) 就是三角形 O&amp;nbsp;- P[ i + 1 ] - P[ i ] 的面积（平行四边形面积的一半，O 表示原点）。当然，由于叉积有符号，所以原点位于多边形外部也成立，只是在内部更直观，更容易理解。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;备注：我们可以把存储顶点的数组扩充一个元素，然后把 P( n+1 ) 赋值为 P( 0 )，这样我们对上式的循环中就不必对顶点索引使用取模运算（MOD）。我自己写的代码采用的（I）这种计算方法，我参考的代码采用（II）中的计算方法，两者计算量相差不大，但后者不太直观，所以我就稍微解释了下两者本质是相同的。&lt;/p&gt;&lt;p&gt;注意式（I）中的梯形面积是有符号的，和 P1，P2 的点顺序相关( S[ p1-&amp;gt;p2&amp;nbsp;] = -S[ p2-&amp;gt;p1 ] ) ，因此 Area 的符号和顶点顺序有关，所以最后别忘了对计算结果求绝对值。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（2）麻烦在于，什么样的多边形是 Impossible 的&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;做题的时候肯定我们就会着重考虑这一点。因为不管任何多边形，按照（1）都能算出个面积，但是多边形是否是有效的需要单独判断。设多边形有 n 个顶点和边，则：&lt;/p&gt;&lt;p&gt;2.1） n &amp;lt; 3 时，显然是 Impossible，因为一个点或一个线段不能组成多边形。&lt;/p&gt;&lt;p&gt;2.2） n &amp;gt; 3 时，依次判断每条边 和 它的所有非相邻边 不能相交（包含交点位于某一条线段上的情况），保证这一点即可。&lt;/p&gt;&lt;p&gt;2.3） n = 3 时，是三角形，无须做 2.2 中的检测。&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;如果三角形的三个点共线的话，是不是应该输出 Impossible，我们没有考虑也 AC 了&lt;/span&gt; （即我们会对这种情况认为是有效的而输出 0.00），估计 OL平台的测试输入也没有考虑这种情况。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下面我们考虑2.2中的检测：&lt;/p&gt;&lt;p&gt;总的边数为 n，则每条边的非相邻边为（n-3）条，所以检测完所有边的情况类似冒泡排序，以及绘制多边形所有顶点的连接线的金刚石图形，需要耗费O（n^2)的时间复杂度。&lt;/p&gt;&lt;p&gt;相邻边必然是相交于顶点的所以不用检测，即使相邻边向内重叠了，比如连续的三个顶点：（0，0），（0，5），（0，3）这种情况也不必担心，因为在下一条边检测时也会检测出相交情况的。&lt;/p&gt;&lt;p&gt;判断两个线段是否相交属于算法中的计算几何部分，主要原理是 &lt;span style="background-color: #ccffff; color: #0000ff;"&gt;如果两个线段相交，则从任何一个线段角度看，另一个线段的两个端点都位于它自己的两侧（该线段以任一端点为原点旋转到经过另一个线段的两个端点的时针方向相反）。&lt;/span&gt; 两个矢量的相对旋转方向利用矢量叉积求出。&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ccffff; color: #0000ff;"&gt;我原来还考虑了浮点数和 0 的比较判断，实际上最后从提交结果发现无需考虑这个问题，直接和 0 比就是了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;（3）对顶点坐标的存储&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为了检测多边形是不是Impossible的，就必须要存储所有顶点的坐标。如果不需要判断这个，就不需要任何额外的存储空间。那样就简洁多了。当然那样的话这道题也就毫无任何难度，也失去了对计算几何的考察点。&lt;/p&gt;&lt;p&gt;我看了我参考的解法，我居然没有想到像他开一个维度为1000的数组，ft！我是用了一个链表来存储所有的边。。。。汗。。。（当然应该用STL就可以，我习惯了自己写链表的代码），所以我的代码比我参考的那个人的多好多。。。（他的代码好简短！）&lt;/p&gt;&lt;p&gt;另外，由于我用链表存储的是线段，相当于每个顶点被我存储了两次，所以实际上还是浪费了一倍的堆上内存。另外还要加上链表使用的指针占用的空间。当然优点是动态内存管理相比静态数组在内存的使用上要灵活一些，这就无须多做解释了。&lt;/p&gt;&lt;p&gt;检测边是否相交实际上和那个人的代码的原理基本一致，这部分代码我基本是照着《算法导论》上的伪码直译过来的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我提交的代码如下：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('8109df70-4763-410a-a1ef-8b784ad0fcbc')"&gt;&lt;div id="cnblogs_code_open_8109df70-4763-410a-a1ef-8b784ad0fcbc" class="cnblogs_code_hide"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;#define ZEROVALUE 0.00000000000001&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#ifndef __max&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __max(a,b)  (((a) &amp;gt; (b)) ? (a) : (b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#ifndef __min&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __min(a,b)  (((a) &amp;lt; (b)) ? (a) : (b))&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;typedef &lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; _LINE&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2;&lt;br /&gt;    _LINE* pNext;&lt;br /&gt;} LINE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;以Pi为原点，从 PiPj 到 PiPk 的方位（返回值的符号表示顺时针 or 逆时针）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; Direction(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yi, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;原点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yj, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段1结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yk) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段2结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (xk - xi) * (yj - yi) - (xj - xi) * (yk - yi);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//如果点 Pk 位于线段 PiPj &lt;/span&gt;&lt;span style="color: #008000;"&gt;所在直线上，则它是否位于该线段内&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OnSegment(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xi, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yi,  &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xj, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yj, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段1结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; xk, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; yk) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线段2结束点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(xk &amp;gt;= __min(xi, xj) &amp;amp;&amp;amp; xk &amp;lt;= __max(xi, xj)&lt;br /&gt;        &amp;amp;&amp;amp; yk &amp;gt;= __min(yi, yj) &amp;amp;&amp;amp; yk &amp;lt;= __max(yi, yj))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;判断两个线段P1P2，P3P4&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; intersect(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x3, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y3,&lt;br /&gt;              &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x4, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y4)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d1 = Direction(x3, y3, x4, y4, x1, y1);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d2 = Direction(x3, y3, x4, y4, x2, y2);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d3 = Direction(x1, y1, x2, y2, x3, y3);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; d4 = Direction(x1, y1, x2, y2, x4, y4);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(    ((d1 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d2 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) || (d1 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d2 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;))&lt;br /&gt;        &amp;amp;&amp;amp; ((d3 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d4 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) || (d3 &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; d4 &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)) )&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d1 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x3, y3, x4, y4, x1, y1))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d2 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x3, y3, x4, y4, x2, y2))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d3 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x1, y1, x2, y2, x3, y3))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(d4 == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; OnSegment(x1, y1, x2, y2, x4, y4))&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绝对不相交&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 增加线段到链表尾部 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddLine(LINE** ppHead, LINE** ppTail,&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2, &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2)&lt;br /&gt;{&lt;br /&gt;    LINE *pNode = (LINE*)malloc(&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(LINE));&lt;br /&gt;    pNode-&amp;gt;pNext = NULL;&lt;br /&gt;    pNode-&amp;gt;x1 = x1;&lt;br /&gt;    pNode-&amp;gt;y1 = y1;&lt;br /&gt;    pNode-&amp;gt;x2 = x2;&lt;br /&gt;    pNode-&amp;gt;y2 = y2;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(*ppTail != NULL)&lt;br /&gt;    {&lt;br /&gt;        (*ppTail)-&amp;gt;pNext = pNode;    &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        *ppHead = pNode;&lt;br /&gt;    }&lt;br /&gt;    *ppTail = pNode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; FreeList(LINE** ppHead, LINE** ppTail)&lt;br /&gt;{&lt;br /&gt;    LINE* pNode = (*ppHead);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pNode != NULL)&lt;br /&gt;    {&lt;br /&gt;        LINE* tmp = pNode-&amp;gt;pNext;&lt;br /&gt;        free(pNode);&lt;br /&gt;        pNode = tmp;&lt;br /&gt;    }&lt;br /&gt;    *ppHead = NULL;&lt;br /&gt;    *ppTail = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 检查是否这一系列点围成的多边形是否合法 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CheckValid(LINE* pHead)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 当前正循环到的边的索引 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    LINE* pCur = pHead;&lt;br /&gt;    LINE* pTest;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pCur != NULL)&lt;br /&gt;    {&lt;br /&gt;        pTest = NULL;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(pCur-&amp;gt;pNext != NULL)&lt;br /&gt;            pTest = pCur-&amp;gt;pNext-&amp;gt;pNext;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(pTest != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;最后一条边(n-1) -- (0)，不与第一条边 (0) -- (1) 检测&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index == &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; pTest-&amp;gt;pNext == NULL)&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 非相邻边相交？ &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(intersect(pCur-&amp;gt;x1, pCur-&amp;gt;y1, pCur-&amp;gt;x2, pCur-&amp;gt;y2,&lt;br /&gt;                pTest-&amp;gt;x1, pTest-&amp;gt;y1, pTest-&amp;gt;x2, pTest-&amp;gt;y2))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            pTest = pTest-&amp;gt;pNext;&lt;br /&gt;        }&lt;br /&gt;        pCur = pCur-&amp;gt;pNext;&lt;br /&gt;        ++index;&lt;br /&gt;    }    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;    LINE *pHead = NULL, *pTail = NULL;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i, n = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, figure = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x0, y0, x1, y1, x2, y2;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; area = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;int test = intersect(0, 1, 1, 0, 1, -1, 0, 0.5);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;n);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打印一个空行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(figure &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        area = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf %lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x0, &amp;amp;y0);&lt;br /&gt;        x1 = x0;&lt;br /&gt;        y1 = y0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt;= n; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i &amp;lt; n)&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf %lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &amp;amp;x2, &amp;amp;y2);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                x2 = x0;&lt;br /&gt;                y2 = y0;&lt;br /&gt;            }&lt;br /&gt;            area += (y1 + y2) * (x2 - x1) * &lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            AddLine(&amp;amp;pHead, &amp;amp;pTail, x1, y1, x2, y2);&lt;br /&gt;&lt;br /&gt;            x1 = x2;&lt;br /&gt;            y1 = y2;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(area &amp;lt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            area *= -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n &amp;lt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;)&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!CheckValid(pHead))&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: %.02lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, figure, area);&lt;br /&gt;&lt;br /&gt;        FreeList(&amp;amp;pHead, &amp;amp;pTail);&lt;br /&gt;&lt;br /&gt;        figure++;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;另附上我参考的代码：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('38740d40-c89f-44e8-ae7b-54990ec10a27')"&gt;&lt;div id="cnblogs_code_open_38740d40-c89f-44e8-ae7b-54990ec10a27" class="cnblogs_code_hide"&gt;发信人: dynamic (programming@math), 信区: ACMICPC&lt;br /&gt;标  题: Re: 1010里的错误多边形有多少可能性？&lt;br /&gt;发信站: 逸仙时空 Yat-sen Channel (Wed Apr  &lt;span style="color: #800080;"&gt;9&lt;/span&gt; &lt;span style="color: #800080;"&gt;20&lt;/span&gt;:&lt;span style="color: #800080;"&gt;55&lt;/span&gt;:&lt;span style="color: #800080;"&gt;07&lt;/span&gt; &lt;span style="color: #800080;"&gt;2003&lt;/span&gt;), 站内信件&lt;br /&gt;&lt;br /&gt;我的程序&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;zju 1010&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;by dynamic&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;on sunday july 28th&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; det(&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x1,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y1,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x2,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y2,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x3,&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; y3)&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x1*y2+x2*y3+x3*y1-x2*y1-x3*y2-x1*y3;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; n,i,j,count=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,temp;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;double&lt;/span&gt; x[&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;],y[&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;],area;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;                scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;amp;n);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (n==&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                count++;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (count&amp;gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Figure %d: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,count);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++) scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf%lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;amp;x[i],&amp;amp;y[i]);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (n&amp;lt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;){&lt;br /&gt;                        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++)&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j=(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)/n;j&amp;lt;i-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;j++){&lt;br /&gt;                                temp=(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n;&lt;br /&gt;                                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (det(x[j],y[j],x[i],y[i],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])*det(x[j],y[j],x[temp],y[temp],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;])&amp;lt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;amp;&amp;amp;&lt;br /&gt;                                        det(x[i],y[i],x[j],y[j],x[temp],y[temp])*det(x[i],y[i],x[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],y[j+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],x[temp],y[temp])&amp;lt;=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;                                        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Impossible\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                                        &lt;span style="color: #0000ff;"&gt;goto&lt;/span&gt; &lt;span style="color: #800080;"&gt;quit&lt;/span&gt;;&lt;br /&gt;                                }&lt;br /&gt;                         }&lt;br /&gt;                area=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;i&amp;lt;n;i++){&lt;br /&gt;                        area+=x[i]*y[(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n];&lt;br /&gt;                        area-=y[i]*x[(i+&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)%n];&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (area&amp;lt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) area*=-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;                printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.2lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,area/&lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #800080;"&gt;&lt;strong&gt;quit&lt;/strong&gt;&lt;/span&gt;:;&lt;br /&gt;        }&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. 《算法导论》，第33章（计算几何学）33.1 节（线段的性质）。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hoodlum1980/aggbug/2236627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hoodlum1980/archive/2011/11/04/2236627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
