猫吃老鼠的系统化算法

2016-01-29 12:14 16 1 收藏

猫吃老鼠的系统化算法,猫吃老鼠的系统化算法

【 tulaoshi.com - C语言心得技巧 】

猫吃老鼠的系统化算法

作者:李斤询

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载本文示例源代码

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com) 我在VC知识库网站看到猫吃老鼠问题的算法程序(原文请见:http://www.vckbase.com/document/viewdoc/?id=952),觉得可以使程序更加的系统化,条理更清楚点。为此本人思索了一个新的算法程序,请各位赐教。

一、问题描述
现有n个老鼠围成一圆圈,有一只猫从任意位置开始吃老鼠,每次都隔一个老鼠吃,请给出最后一个老鼠的编号?题目要求是任给老鼠数n,输出猫最后吃的老鼠的编号。

二、问题求解
我们假设有N个老鼠,序号依次为1,2,3,......,N-1,N,并且按序号先后以顺时针围成一圈。

老鼠信息的结构定义如下,使用双向列表,如下:
typedef struct MouseNode{int nNO;MouseNode *pNext;MouseNode *pPre;MouseNode() { nNO = 0; pNext = NULL; pPre = NULL; }MouseNode(int NO) { nNO = NO; pNext = NULL; pPre = NULL; }}MouseNode;

我的算法只有一个函数,这个函数完成吃一圈老鼠。传入的参数是双向链表中本次要吃掉的第一个老鼠,返回值是下一圈吃老鼠时要第一个吃掉的老鼠。
函数代码如下:
 // CatEatMouses /*本函数只吃一圈老鼠,循环调用它来吃完老鼠参数本次要吃掉的老鼠返回下一圈吃老鼠时候要吃的第一个老鼠若返回值为空,则说明老鼠已经吃完了*/MouseNode *CatEatMouses(MouseNode *pStartMouse){MouseNode *pFirst = pStartMouse;MouseNode *pFirstNotEatMouse = pFirst->pNext;if(pFirst == pFirstNotEatMouse){printf("%d ", pFirst->nNO);return NULL; // 吃完了 }bool bCanEat = true;while (true){if(pFirst == pFirstNotEatMouse){if(bCanEat){return pFirstNotEatMouse;}else{return pFirstNotEatMouse->pNext;}}if(bCanEat){pFirst->pPre->pNext = pFirst->pNext;pFirst->pNext->pPre = pFirst->pPre;printf("%d ", pFirst->nNO);pFirst = pFirst->pNext;bCanEat = false;}else{pFirst = pFirst->pNext;}}}
三、演示函数
演示函数代码如下:
void DemoEatMouse(int nMouseCount){if(nMouseCount <= 1){printf("1");return ;}// 开辟N个老鼠内存并初始化 MouseNode *pMouseBuffer = new MouseNode[nMouseCount];// 初始化双向链表 pMouseBuffer[0].pNext = &pMouseBuffer[1];pMouseBuffer[0].pPre = &pMouseBuffer[nMouseCount - 1];pMouseBuffer[0].nNO = 1;pMouseBuffer[nMouseCount - 1].pNext = &pMouseBuffer[0];pMouseBuffer[nMouseCount - 1].pPre = &pMouseBuffer[nMouseCount - 2];pMouseBuffer[nMouseCount - 1].nNO = nMouseCount;for(int i = 1;i < nMouseCount - 1;i++){pMouseBuffer[i].pPre = &pMouseBuffer[i - 1];pMouseBuffer[i].pNext = &pMouseBuffer[i + 1];pMouseBuffer[i].nNO = i + 1;}// 开始吃老鼠 MouseNode *pNextEatMouse = &pMouseBuffer[0];while (pNextEatMouse){if(pNextEatMouse->pNext == pNextEatMouse){printf("n最后一只老鼠是 ");}pNextEatMouse = CatEatMouses(pNextEatMouse);}printf("nn");delete[] pMouseBuffer;}
演示函数主要是初始化nMouseCount个老鼠的双向链表,然后调用CatEatMouses函数来吃老鼠,一直到CatEatMouses函数返回NULL为止,说明老鼠吃完了。

四、结束语
算法的实现不是说结果对就可以了,我们应该力求让他系统化;如本算法,最终目标是吃掉所有的老鼠,但是我们抓住其中的规律,变换实现每次吃一圈的CatEatMouses函数,每次吃完一圈后又形成一个新的双向链表,在调用CatEatMouse函数。如此算法清晰明了,重复利用性高。

来源:http://www.tulaoshi.com/n/20160129/1485225.html

延伸阅读
标签: 简笔画
吃西瓜的猫简笔画视频教学 简笔画的好处是可以帮助我们画各种我们喜欢的东西,那么我们喜欢小猫我们就来画画它,平时猫咪都是高傲的,我们画猫咪的时候就可以把它画的可爱一点,我们在画猫咪的时候,先来看看吃西瓜的猫的简笔画教学视频吧。 吃西瓜的猫简笔画怎么画 我们先把吃西瓜的猫整个身子画出来。 然后开始画...
可怜的老鼠 早晨洗脸时,我指着琪儿的眼屎问她:“这是什么?”,琪儿回答:“是夜里老鼠趁我睡着了拉的屎”,“是吗?”我表现出一副很惊奇的样子,“当然了,谁让老鼠没有马桶,就拉在这儿了”,琪儿一边回答一边指着眼角,我闻言大笑! 琪儿在摇篮的家:蛋糕王国A座7722号 童话故事:老鼠开会! 童话故事:老鼠开会! 有一天,小猫要...
标签: 游戏动漫
《胧村正》DLC奖杯 化猫-津奈缶猫魔稿攻略详解 《胧村正》DLC奖杯化猫-津奈缶猫魔稿技巧心得: 化猫-津奈缶猫魔稿DLC奖杯列表: 阅读延伸: 《胧村正》快速升级刷魂心得攻略 《胧村正妖刀传》剧情大全 3大结局需6次通关 《质量效应3》中导入质量效应2存档的方法(PC版) 《胧村正》战斗评价达成条件一览 对于战斗评价方面...
标签: 折纸 折纸教程
你知道老鼠的折法吗?拿起手中的纸折一个可爱的老鼠吧!今天跟大家分享老鼠的折法,要认真学哦! 老鼠的折法:
昨天在墙角下看见了一只小小的老鼠在偷东西吃,全身长着灰色毛,拖着一条长长的尾巴,头上两只尖尖的小耳朵,很警惕的样子。 还有两只闪着机灵目光的小小的眼睛,非常可爱!虽然老鼠的样子很可爱,很多女生还是害怕它,因为老鼠毕竟不是人类的朋友,而且还对人类有害,不过今天图老师的这个手工折纸小老鼠可不会有害哦!而且还非常可爱呢...

经验教程

123

收藏

10
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部