马上就要华为机试了, 华为的机试虽然没什么算法但拿他的题目练练手还是有必要的~我如果不是被刷掉了就是放在了第二批,祝第一批的实验室兄弟姐妹们顺利~
/*************************************************************************************************
约瑟夫环问题
[问题描述]
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个
密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人
开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,
将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报
数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺
序。
[基本要求]
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的
编号。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的
界限。
[测试数据]
n的初值为3,m=2 ,3个人的密码依次为3,1,2首先m=则正确的输出是什么?
要求:
输入数据:首先输入待处理人员数及他们的密码,然后输入m的初值,建
立单循环链表。
输出形式:建立一个输出函数,将正确的出列序列输出
***************************************************************************************************/
#include <iostream>
#include <assert.h>
using namespace std;
typedef struct _Node
{
int num;
int key;
bool status;//指示是否还在约瑟夫环内(true 在;false不在)
_Node *next;
}Node;
//建立有n个人的Joseph环,key由外部输入,返回头指针
Node *CreateJosephRim(int n)
{
assert(n>0);
Node *head = (Node*)malloc(sizeof(Node));
assert(head);
head->num = 1;
head->status = true;
head->next = head;
int key;
cout<<"Please input the number1's key:";
cin>>key;
head->key = key;
Node *p = head;
for (int i=1; i<n; ++i) {
Node *q = (Node*)malloc(sizeof(Node));
assert(q);
p->next = q;
q->num = i+1;
q->status = true;
q->next = head;
cout<<"Please input the number"<<i+1<<"\'s key:";
cin>>key;
q->key = key;
p = q;
}
return head;
}
void deleteJosephRim(Node *head)
{
assert(head);
Node *p = head;
Node *q;
do {
q = p->next;
free(p);
p = q;
}while(p!=head);
}
void PrintJosephRim(Node *head)
{
assert(head);
Node *p = head;
do {
cout<<p->num<<" "<<p->key<<endl;
p = p->next;
} while (p!=head);
}
//条件:直到所有人全部出列为止,做函数用来判断还在约瑟夫环中的人数
int GetPeopleNum(Node *head)
{
assert(head);
int count = 0;
Node *p = head;
do {
if (p->status)
++count;
p = p->next;
} while (p!=head);
return count;
}
void PlayJosephGame(Node *head, int m)
{
Node *p = head;
Node *q;
int count = m;
while (GetPeopleNum(head)) {
while (count) {
if (p->status) {
--count;
q = p;
}
p = p->next;
}
cout<<q->num<<"出列"<<endl;
q->status = false;
count = q->key;
}
}
int main(int argc, char **argv)
{
Node *head = CreateJosephRim(10);
PrintJosephRim(head);
cout<<"people num in Joseph Rim: "<<GetPeopleNum(head)<<endl;
PlayJosephGame(head, 3);
deleteJosephRim(head);
system("pause");
return 0;
}
粗略编写了下,程序应该有不少问题没考虑到~