算法

yhjj0108 2008-12-12 02:08:19
小明有15个苹果和15个桔子,他现在在选择吃苹果还是桔子,于是他想了个办法,30个水果围成一圈,从第一个水果开始报数,每数到第九个水果就吃掉它,如此循环直到仅剩15个水果为止。问怎样排才能使每次吃到的都是桔子。输出排列中用'#'表示苹果,'%'表示桔子。求好的算法啊!!
...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhjj0108 2008-12-12
  • 打赏
  • 举报
回复
谢谢了哈。
zhanshen2891 2008-12-12
  • 打赏
  • 举报
回复
输出:
8
17
26
5
15
25
6
18
29
11
23
7
21
4
22

把以上序号下放上橘子即可
zhanshen2891 2008-12-12
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "windows.h"
#define TOTALCOUNT 30

typedef struct node
{
int nNumber; // 当前节点在链表中的位置
node* pkNext;
}*PNODE;

int naArray[15] = {0}; // 存储链表中的节点位置

PNODE CreateCircle() // 建立循环链表
{
PNODE pHead = new node;
PNODE pText = pHead;
for (int i = 0; i < TOTALCOUNT - 1; i++)
{
pText->nNumber = i;
pText->pkNext = new node;
pText = pText->pkNext;
}
pText->nNumber = TOTALCOUNT - 1;
pText->pkNext = pHead;
return pHead;
}

void HandleNode(PNODE pStart) // 从第一个起每数9个出圈
{
int nCount = 0;
int nNumber = 0;
while (nCount < 15)
{
nNumber++;

if (nNumber == 8)
{
nNumber = 0;
naArray[nCount] = pStart->pkNext->nNumber;
nCount++;
PNODE pTemp = pStart->pkNext;
pStart->pkNext = pStart->pkNext->pkNext;
delete pTemp;
}
pStart = pStart->pkNext;

}
}
void PrintNode()
{
for (int i = 0; i < sizeof(naArray) / sizeof(int); i++)
{
cout << naArray[i] << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
PNODE pHead = CreateCircle();
HandleNode(pHead);
PrintNode();
return 0;
}
SearchLife 2008-12-12
  • 打赏
  • 举报
回复
mark
xtting_8984313 2008-12-12
  • 打赏
  • 举报
回复
我看错了,这个对了,不好意思。
if(Queue[count%30]=='%')
{
count++;continue;
},这个就是了
xtting_8984313 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dahua010 的回复:]
C/C++ code#include<stdio.h>voidmain()
{charQueue[30];inti=0;for(i;i<30;i++)
Queue[i]='#';
i=1;intcount=0;intiExit=0;while(iExit!=15)
{if(Queue[count%30]=='%')
{
count++;continue;
}if(i%9==0)
{
Queue[count%30]='%';
iExit++;
}
i++;
count++;
}
printf("%s \n",Queue);
}

随手写的
[/Quote]


本质上就是每次第九个都是橘子,但是要考虑到每次圈的大小可能不相同。
感觉这个没有考虑到这一点,稍微修正就好了。
bobye1230 2008-12-12
  • 打赏
  • 举报
回复
返回结果就是橘子的位置....且按被吃掉的顺序返回
bobye1230 2008-12-12
  • 打赏
  • 举报
回复

#include <vector>
#include <iostream>
using namespace std;

void sort1(int distance/*步长*/, int max/*总数*/, int size/*排序个数*/, vector<int> &ret/*返回结果*/)
{
int pos[max+1];
memset(pos, 1, (max+1)*sizeof(int));
pos[0]=0;//位置0不用...
int current = 0;
for(i=0;i<size;i++)
{
int temp = 0;
while(temp!=distance)
{
current =(++current )%(max+1);
temp+=pos[current ];
}
pos[current ]=0;
ret.push_back(current );
}
}

void main()
{
vector<int> ret ;
sort1(9, 30, 15, ret);
for(int i=0;i<ret.size();i++)
cout<<ret[i]<<endl;
}
laoxu1102 2008-12-12
  • 打赏
  • 举报
回复
你看这样行不:
1、设一有30个节点的循环链表,链表相应数据为1,设置橘子计数器j为0,普通计数器i也为0
2、开始判断:当节点值为-1则跳过,否则普通计数器i++,到9时则将此节点数据由1改为-1,橘子计数器j++;
3、判断j<15,为真则回到2;为假则结束
dahua010 2008-12-12
  • 打赏
  • 举报
回复

#include <stdio.h>
void main()
{
char Queue[30];
int i=0;
for(i;i<30;i++)
Queue[i] = '#';
i=1;
int count = 0;
int iExit = 0;
while(iExit !=15)
{
if(Queue[count%30] == '%')
{
count++;
continue;
}
if(i % 9 == 0)
{
Queue[count%30] = '%';
iExit++;
}
i++;
count++;
}
printf("%s \n",Queue);
}


随手写的

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧