﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-野猪世界-随笔分类-算法</title><link>http://www.cppblog.com/zhuyeaini/category/14138.html</link><description>server ogre cegui bullet python lua</description><language>zh-cn</language><lastBuildDate>Tue, 04 Aug 2015 07:54:02 GMT</lastBuildDate><pubDate>Tue, 04 Aug 2015 07:54:02 GMT</pubDate><ttl>60</ttl><item><title>二叉树 动态规划  回溯算法</title><link>http://www.cppblog.com/zhuyeaini/archive/2012/06/14/118969.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Thu, 14 Jun 2012 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2012/06/14/118969.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/118969.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2012/06/14/118969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/118969.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/118969.html</trackback:ping><description><![CDATA[算法博大精深 平时就多积累点<br />1.二叉树的非递归遍历<br />*先序<br />思想：a.根树进栈；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.只要栈不为空 得到栈顶节点 开始循环遍历其左树 同时访问并进栈 一直到左树为空；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.出栈直到找到有右子树的节点；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.访问该右子树并进栈；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.转到b步骤<br />大概如下：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;preOrderTravel(BinTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;t)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BinTree</span><span style="color: #000000;">*</span><span style="color: #000000;">,std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BinTree</span><span style="color: #000000;">*&gt;&gt;</span><span style="color: #000000;">&nbsp;s;<br />&nbsp;&nbsp;&nbsp;&nbsp;BinTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">t)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">t</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">data</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;s.push(t);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">s.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=</span><span style="color: #000000;">s.top();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">data</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.push(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=</span><span style="color: #000000;">s.pop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right)</span><span style="color: #000000;">&amp;&amp;!</span><span style="color: #000000;">s.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=</span><span style="color: #000000;">s.pop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">data</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.push(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>
<br /><img src ="http://www.cppblog.com/zhuyeaini/aggbug/118969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2012-06-14 17:20 <a href="http://www.cppblog.com/zhuyeaini/archive/2012/06/14/118969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost pool object_pool</title><link>http://www.cppblog.com/zhuyeaini/archive/2011/04/26/145075.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Tue, 26 Apr 2011 10:18:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2011/04/26/145075.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/145075.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2011/04/26/145075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/145075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/145075.html</trackback:ping><description><![CDATA[<p>&nbsp;</p><div>好 看了一天的object_pool &nbsp;容易嘛 &nbsp; 现在总结下</div><div>这个 什么的 继承自pool&nbsp;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;pool<br />{<br />&nbsp;&nbsp;&nbsp;details::PODptr&lt;size_type&gt;&nbsp;list;<br />}</div></div><div>这里list干什么的呢 如下所示 保存着分配的所有数据块&nbsp;</div><div>其中的sz不仅仅包含数据本身的大小 还包括下个数据块的指针和大小</div><div>所以 整个数据块就可以串联起来 就像名字list一样</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;PODptr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;sz;<br />}</div></div><div>一个pool的内存就在ptr里面了 一开始空的</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;size_type&nbsp;partition_size&nbsp;=&nbsp;alloc_size();<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;size_type&nbsp;POD_size&nbsp;=&nbsp;next_size&nbsp;*&nbsp;partition_size&nbsp;+<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;details::pool::ct_lcm&lt;<span style="color: #0000FF; ">sizeof</span>(size_type),&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">void</span>&nbsp;*)&gt;::value&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>(size_type);<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ptr&nbsp;=&nbsp;UserAllocator::malloc(POD_size);<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;next_size&nbsp;&lt;&lt;=&nbsp;1;</div></div><div>在这里就分配内存了 第一次next_size=32 然后是64,128...partition_size 大概就是我们要分配类型的字节大小</div><div>后面两个值details::pool::ct_lcm&lt;sizeof(size_type), sizeof(void *)&gt;::value和sizeof(size_type)</div><div>&nbsp;一个是指向下个内存块的指针，一个是下个内存块的大小</div><div>一般都为4个字节，加起来就是8个字节，</div><div>所以其总大小为数据块大小+8个字节</div><div>好 下面就是比较关键的 就是对这块内存块的管理&nbsp;</div><div>好 pool继承自simple_segregated_storage</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;simple_segregated_storage<br />{<br />&nbsp;<span style="color: #0000FF; ">protected</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;first;<br />}</div></div><div>然后嘛 first在一开始内存分配的时候就指向内存块的开始&nbsp;</div><div>并且采用boost大无上手法可以让内存块串联起来 不管怎么样 nextof(first)就是下一个我们的类型块，</div><div>一开始不是分配了32块那样的类型嘛，值得注意的是，</div><div>first始终是指向第一个空闲块的，每次要分配一个类型块时，取first值，返回给请求者，然后first=nextof(first)</div><div>好 那么释放怎么做的呢 事实上很简单 即把要释放的块重新用first回收起来 并且是有序的串起来 即按照内存从小到大用next()</div><div>串起来 这样有啥好处呢 在~object_pool发生时，比较方便快速，具体看代码就是了 为了每次在destroy()时保持有序：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ordered_free(<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;chunk)<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;(slower)&nbsp;implementation&nbsp;of&nbsp;'free'&nbsp;places&nbsp;the&nbsp;memory<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;back&nbsp;in&nbsp;the&nbsp;list&nbsp;in&nbsp;its&nbsp;proper&nbsp;order.<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Find&nbsp;where&nbsp;"chunk"&nbsp;goes&nbsp;in&nbsp;the&nbsp;free&nbsp;list</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;loc&nbsp;=&nbsp;find_prev(chunk);<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Place&nbsp;either&nbsp;at&nbsp;beginning&nbsp;or&nbsp;in&nbsp;middle/end</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(loc&nbsp;==&nbsp;0)<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(chunk);<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextof(chunk)&nbsp;=&nbsp;nextof(loc);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextof(loc)&nbsp;=&nbsp;chunk;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;template&nbsp;&lt;typename&nbsp;SizeType&gt;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;simple_segregated_storage&lt;SizeType&gt;::find_prev(<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ptr)<br /><span style="color: #008080; ">18</span>&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Handle&nbsp;border&nbsp;case</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(first&nbsp;==&nbsp;0&nbsp;||&nbsp;std::greater&lt;<span style="color: #0000FF; ">void</span>&nbsp;*&gt;()(first,&nbsp;ptr))<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;iter&nbsp;=&nbsp;first;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(<span style="color: #0000FF; ">true</span>)<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;we're&nbsp;about&nbsp;to&nbsp;hit&nbsp;the&nbsp;end&nbsp;or<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;if&nbsp;we've&nbsp;found&nbsp;where&nbsp;"ptr"&nbsp;goes</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nextof(iter)&nbsp;==&nbsp;0&nbsp;||&nbsp;std::greater&lt;<span style="color: #0000FF; ">void</span>&nbsp;*&gt;()(nextof(iter),&nbsp;ptr))<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;iter;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;nextof(iter);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">31</span>&nbsp;}</div></div><div>很容易构造一种最坏复杂度的情况：</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;10000;<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sample*&nbsp;a[N];<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(&nbsp;i=0;&nbsp;i&lt;N;&nbsp;++i)<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;pool.cunstruct();<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(i=0;&nbsp;i&lt;N;&nbsp;++i)<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.destory(&nbsp;a[i]&nbsp;);</div></div><div>在这种情况下，每次的find_prev会耗费O(N)时间，需要注意下。。。</div><p>&nbsp;</p><img src ="http://www.cppblog.com/zhuyeaini/aggbug/145075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2011-04-26 18:18 <a href="http://www.cppblog.com/zhuyeaini/archive/2011/04/26/145075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迷宫问题 回溯法</title><link>http://www.cppblog.com/zhuyeaini/archive/2010/08/12/123188.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Thu, 12 Aug 2010 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2010/08/12/123188.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/123188.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2010/08/12/123188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/123188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/123188.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.cppblog.com/images/cppblog_com/zhuyeaini/shiye.png" height="256" width="256" /><br /><br />如图，有如此的一个迷宫，要从起点到终点，紫色方格是障碍物方格，不可通行。<br />求：<br />找出一条从起点到终点的道路，在到达终点之前，必须走遍所有可通行的方格一次，而且到达终点的<br />转弯次数要最少，每改变一次前进方向算作转弯一次。<br /><br />经典的回溯法解题思路：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">方格m*n,k个障碍物</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m,n,k;<br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">目标方格</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dx,dy;<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">当前拐弯数，最右拐弯数</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dirs,best;<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">总共找到几条路线</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count;<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;depth,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;di)<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">{<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(depth</span><span style="color: #000000;">==</span><span style="color: #000000;">m</span><span style="color: #000000;">*</span><span style="color: #000000;">n</span><span style="color: #000000;">-</span><span style="color: #000000;">k&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;dx</span><span style="color: #000000;">==</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;dy</span><span style="color: #000000;">==</span><span style="color: #000000;">y&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;)<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">找到一条路线</span><span style="color: #008000;"><br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dirs</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">best)<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best</span><span style="color: #000000;">=</span><span style="color: #000000;">dirs;<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存最优路径，即标记不为0的方格</span><span style="color: #008000;"><br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;save();<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">8</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(没有出边界&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;该方格未行走过)<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;board[x</span><span style="color: #000000;">+</span><span style="color: #000000;">dx[i]][y</span><span style="color: #000000;">+</span><span style="color: #000000;">dy[i]]</span><span style="color: #000000;">=</span><span style="color: #000000;">depth</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(di</span><span style="color: #000000;">!=</span><span style="color: #000000;">i)&nbsp;dirs</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(depth</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">,x</span><span style="color: #000000;">+</span><span style="color: #000000;">dx[i],y</span><span style="color: #000000;">+</span><span style="color: #000000;">dy[i],i);<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">恢复转弯次数</span><span style="color: #008000;"><br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(di</span><span style="color: #000000;">!=</span><span style="color: #000000;">i)&nbsp;dirs</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">恢复未行走标记</span><span style="color: #008000;"><br /></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;board[x</span><span style="color: #000000;">+</span><span style="color: #000000;">dx[i]][y</span><span style="color: #000000;">+</span><span style="color: #000000;">dy[i]]</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />看上去挺复杂的问题，用回溯法可以很好地解决，还可以加入剪枝函数，即检测当前dirs是否已经大于best，如果<br />是的话，直接返回。<br /><img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emkulou.gif" align="absmiddle" border="0"  alt="" /><br /><img src ="http://www.cppblog.com/zhuyeaini/aggbug/123188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2010-08-12 16:07 <a href="http://www.cppblog.com/zhuyeaini/archive/2010/08/12/123188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>