找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1326|回复: 7

[求助]求个思路

[复制链接]
发表于 2009-11-2 05:33:05 | 显示全部楼层 |阅读模式 IP:江苏扬州
一群小孩围成一个圈,任意假定一个数M,从第一个小孩起,顺时针方向数,每次数到第M个小孩时,该小孩就离开,小孩不断的离开,圈子不断缩小,最后,剩下的小孩便是胜利者,那么,究竟谁是胜利者?



小弟刚学C++,望各位大哥大姐可以给我点思路,我实在是想不出来了,又没人教我。看书又看不懂
发表于 2009-11-2 05:33:11 | 显示全部楼层 IP:江苏扬州
这题的答案好像任何书上都有啊,至少十年前俺用谭浩强叔叔的书学C的时候就是标准习题。
随便设个数组,循环链表之类的,每数一次删掉一个数就可以了。
回复

使用道具 举报

发表于 2009-11-2 05:33:18 | 显示全部楼层 IP:江苏扬州
程序代码:

#define NEED_MORE_ROUND -2
// return -2 if need mor eround,
// return -1 if error.
int RoundWinner(int intChildNum, int intCounterNum)
{
int intCount;
static int intCurrentPosition = 0;
static vector<int> vecSequence;
if (intChildNum <= 0 || intCounterNum <= 0)
return -1;
if (intChildNum == 1)
return 1;
// initialize sequence.
if (vecSequence.size() == 0)
{
for (intCount = 0; intCount < intChildNum; intCount++)
vecSequence.push_back(intCount);
}
intCurrentPosition = (intCurrentPosition+intCounterNum-1) % vecSequence.size();
cout << "number " << (vecSequence[intCurrentPosition]+1) << "is out" << endl;
vecSequence.erase(vecSequence.begin() + intCurrentPosition);
if (vecSequence.size() > 1)
return NEED_MORE_ROUND;
return vecSequence[0];
}

int main(int argc, char* argv[])
{
int intResult;
while ((intResult = RoundWinner(6, 5)) == NEED_MORE_ROUND)
;
cout << "Winner is number " << intResult+1 << endl;
}
回复

使用道具 举报

发表于 2009-11-2 05:33:24 | 显示全部楼层 IP:江苏扬州
约瑟夫问题!数据结构的课本上关于顺序表的的一个例子,楼上的给的太多了。
#include<iostream.h>
const int n=8; //n个小孩
const int m=4; //1-m报数
void josephus()
{
int p[n]; //建立顺序表
int i,j,t;
for(i=0;i<n;i++)
p[i]=i+1;
t=0; //首次报数的起始位置
for (i=n;i>0;i--) //i是顺序表的长度
{
t=(t+m-1)%i; //t为出列位置
cout<<p[t]<<" "; //p[t]出列
for(j=t+1;j<i;j++)
p[j-1]=p[j]; //后面的元素依次前移
}
}
void main()
{
josephus();
}
回复

使用道具 举报

发表于 2009-11-2 05:33:29 | 显示全部楼层 IP:江苏扬州
补充一下,针对楼主的问题,最后输出的那个当然就是胜利者了。即p[0]。
回复

使用道具 举报

发表于 2009-11-2 05:33:36 | 显示全部楼层 IP:江苏扬州
按照楼主的意思,好象每次都是从第一个开始数,那最后应该是第二个小孩.
回复

使用道具 举报

发表于 2009-11-2 05:33:43 | 显示全部楼层 IP:江苏扬州
楼主说的是“任意假定一个数M”所以还是用动态的数据机构比较好。
回复

使用道具 举报

发表于 2009-11-2 05:33:49 | 显示全部楼层 IP:江苏扬州
皋阳的算法比较让人易懂 思路比较清晰
佩服啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 03:32 , Processed in 0.171624 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表