﻿<?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++博客-CodePanada-随笔分类-C/C++</title><link>http://www.cppblog.com/CodePanada/category/17048.html</link><description>panada 不是熊猫 胜似熊猫</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jun 2011 16:43:24 GMT</lastBuildDate><pubDate>Tue, 07 Jun 2011 16:43:24 GMT</pubDate><ttl>60</ttl><item><title>用位操作实现的n皇后问题</title><link>http://www.cppblog.com/CodePanada/archive/2011/06/08/148239.html</link><dc:creator>陈勇</dc:creator><author>陈勇</author><pubDate>Tue, 07 Jun 2011 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/CodePanada/archive/2011/06/08/148239.html</guid><wfw:comment>http://www.cppblog.com/CodePanada/comments/148239.html</wfw:comment><comments>http://www.cppblog.com/CodePanada/archive/2011/06/08/148239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CodePanada/comments/commentRss/148239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CodePanada/services/trackbacks/148239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp; &nbsp;C语言是我大一时期专业课所学习的第一门语言，离现在差不多也有将近5年的时间。最近想重拾起来，买了一本Plauger大牛的&lt;&lt;The standard C library&gt;&gt;，简单翻了一下，觉得自己如井底之蛙一样。。。以前对C的理解只是皮毛，孰不知这门极其优秀的跨平台可移植的编译语言还有如此精彩的实现。
<div>&nbsp;&nbsp; &nbsp; &nbsp;前几天整理文档，发现了这段用C bit实现的N皇后算法，花了半天时间才把它搞明白。。大家都知道，n皇后的一般解法是回溯，要用一个二维数组表示棋盘，按逐行（列）进行解搜索，对于每个当前解都要进行判断，如成功则继续；失败则回溯。</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;这段用bit实现的代码极其简明。只不过它只是用了一个一维的数组，按行搜索，将列上的、对象线上的限制归一。</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;感兴趣的朋友可以看下：<a href="http://jsomers.com/nqueen_demo/nqueens.html">http://jsomers.com/nqueen_demo/nqueens.html&nbsp;</a>作者的方法跟下面的方法大同小异。</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #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;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">time.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;upperlim&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test(</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;&nbsp;row,&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;&nbsp;ld,&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;&nbsp;rd)&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%ld\t%ld\t%ld\n",row,ld,rd);<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%ld\t",row);&nbsp;<br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("\n%ld\n",upperlim);&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(row&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;upperlim)&nbsp;<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&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: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;pos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;upperlim&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">(row</span><span style="color: #000000; ">|</span><span style="color: #000000; ">ld</span><span style="color: #000000; ">|</span><span style="color: #000000; ">rd);&nbsp;<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%ld\n",pos);</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(pos</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;<br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf("%ld\n",pos);</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">19</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;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pos&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">pos;&nbsp;<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;&nbsp;&nbsp;pos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pos&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;p;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">取得可以放皇后的最右边的列</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;&nbsp;&nbsp;test(row&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;p,(ld&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;p)</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;(rd&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;p)</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;&nbsp;<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;&nbsp;<br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;&nbsp;<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;<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[])&nbsp;<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">{&nbsp;<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;tm;&nbsp;<br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;&nbsp;<br />
</span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(argc&nbsp;&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;atoi(argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);&nbsp;<br />
</span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;time(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((n&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">||</span><span style="color: #000000; ">(n&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">32</span><span style="color: #000000; ">))&nbsp;<br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">只能计算1-32之间的皇后问题\n&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d皇后\n&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,n);&nbsp;<br />
</span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%ld\t</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,upperlim);&nbsp;<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upperlim&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(upperlim&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;n)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">所有位都是1&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%ld\t</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,upperlim);&nbsp;<br />
</span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;<br />
</span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">共有%ld种排列,计算时间%d秒\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,sum,(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)(time(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)</span><span style="color: #000000; ">-</span><span style="color: #000000; ">tm));&nbsp;<br />
</span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pause</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">}&nbsp;</span></div>
</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><br />
</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><br />
</div><img src ="http://www.cppblog.com/CodePanada/aggbug/148239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CodePanada/" target="_blank">陈勇</a> 2011-06-08 00:16 <a href="http://www.cppblog.com/CodePanada/archive/2011/06/08/148239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>