﻿<?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>IT博客-老星头的JoJo技术花园-随笔分类-深入C/C++</title><link>http://www.cnitblog.com/silenceburn/category/1255.html</link><description>主要花草:XML 园间杂草:SNMP C++ JAVA :)</description><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 00:04:36 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 00:04:36 GMT</pubDate><ttl>60</ttl><item><title>猫抓老鼠问题C++实现一例（约瑟夫环问题）</title><link>http://www.cnitblog.com/silenceburn/archive/2006/07/07/13370.html</link><dc:creator>小乔的老哥</dc:creator><author>小乔的老哥</author><pubDate>Fri, 07 Jul 2006 13:51:00 GMT</pubDate><guid>http://www.cnitblog.com/silenceburn/archive/2006/07/07/13370.html</guid><wfw:comment>http://www.cnitblog.com/silenceburn/comments/13370.html</wfw:comment><comments>http://www.cnitblog.com/silenceburn/archive/2006/07/07/13370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/silenceburn/comments/commentRss/13370.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/silenceburn/services/trackbacks/13370.html</trackback:ping><description><![CDATA[
		<p>今天偶然在网上看到了猫抓老鼠问题，<br />当时也没多想，只觉得网上给出的程序的确有很多需要改进的地方，<br />就闷头闷脑的用 循环链表 和 递归 写了一个算法实现，后来发现<br /> 这个问题实际上是经典的约瑟夫环问题的变种，那个晕啊。而且有<br />很多数学的方式来改进。。。。5555。。。<br />看来算法部分要恶补，嗯嗯。。。<br /><br />问题：<br />一、问题描述<br />    现有n个老鼠围成一圆圈，有一只猫从任意位置开始吃老鼠，每次都隔一个老鼠吃，请给出最后一个老鼠的编号？题目要求是任给老鼠数n，输出猫最后吃的老鼠的编号。<br />二、我的解法<br />   N只老鼠成循环链表，从第一只开始，每次隔一个节点，删去一个节点，这样一直删下去，<br />   如果删去的节点的下一个节点已经是链表头了，则将链表头赋值为链表头的下下一个节点，<br />  递归调用删除函数；如果删去的节点的下下一个节点才是链表头，则将链表头赋值为链表头<br />  的下一个节 点， 递归调用删除函数；直至链表头的下下一个节点即是链表头，或链表头的下<br />  一个节点就是链表头，break,输出链表头的编号。（这样做的目的是每次调用删除函数都是从<br />  第一个节点删起。）<br /><br />三 SOURCE:<br /><br />   // CatMousePro.cpp : Defines the entry point for the console application.<br />//</p>
		<p>#include "stdlib.h"<br />#include "stdio.h"<br />#include "string.h"</p>
		<p>#define MOUSENUM 60</p>
		<p>struct Mouse* headMouse;<br />struct Mouse* pervMouse;<br />struct Mouse* cat;// currentMouse Point<br />bool   eatType; // true means mouseNum is a 奇数，false is opposite<br />int    lastMouseNum;</p>
		<p>struct Mouse{<br /> int  Num;<br /> struct Mouse* next;<br />};</p>
		<p>void catEat(struct Mouse* headMouse)</p>
		<p>{<br />  if(headMouse-&gt;next-&gt;next == headMouse || headMouse-&gt;next == headMouse)<br />  {<br />   lastMouseNum = headMouse-&gt;Num;<br />   return;<br />  } <br />  </p>
		<p>  cat = headMouse;<br />  //headMouse = cat-&gt;next;// because first mouse have been eated!<br />  while(1)//not eat one circle<br />  {<br />   pervMouse = cat-&gt;next;<br />   <br />   if(pervMouse-&gt;next == headMouse)<br />   {<br />    headMouse = headMouse-&gt;next;<br />    pervMouse-&gt;next = headMouse;<br />    break;<br />   }<br />   if(pervMouse-&gt;next-&gt;next == headMouse )<br />   {<br />    pervMouse-&gt;next = headMouse-&gt;next;<br />    headMouse = headMouse-&gt;next-&gt;next;<br />    break;<br />   }</p>
		<p>   cat = cat-&gt;next-&gt;next;<br />   pervMouse-&gt;next = cat-&gt;next;<br />  }<br />  catEat(headMouse);<br />}</p>
		<p>int main(int argc, char* argv[])<br />{<br /> Mouse mouse;<br /> mouse.Num=1;<br /> mouse.next = NULL;<br /> <br /> headMouse = &amp;mouse;<br /> pervMouse = &amp;mouse;<br /> <br /> //inital mouse circle<br /> for(int i=2;i&lt;MOUSENUM+1;i++)<br /> {<br />  struct Mouse* newmouse = new struct Mouse;<br />  newmouse-&gt;Num =i;<br />  newmouse-&gt;next = NULL;</p>
		<p>  pervMouse-&gt;next = newmouse;<br />  pervMouse = newmouse; <br /> }<br /> pervMouse-&gt;next = headMouse;</p>
		<p> catEat(headMouse);<br /> //at begin ,eat first mouse</p>
		<p> printf("the last mouse num is:%d",lastMouseNum);</p>
		<p> return 0;<br />}</p>
		<p>
				<br />顺便给出该问题的数学解法：<br />设有N只老鼠，找到大于N的最小的2的X次方（记为M），<br />然后  2N-M 就是结果，这样编程应该很简单了吧？<br /><br />  <br /><br /></p>
<img src ="http://www.cnitblog.com/silenceburn/aggbug/13370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/silenceburn/" target="_blank">小乔的老哥</a> 2006-07-07 21:51 <a href="http://www.cnitblog.com/silenceburn/archive/2006/07/07/13370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>