关于扩展Josephus问题

来源:互联网 发布:598营销软件 编辑:程序博客网 时间:2024/05/19 13:07

        编号为1,2,3   ,,,,n个小孩按顺序顺时针围坐一圈,每个小孩持有一个密码(正整数)。一开始任选一个正整数作为报数上限值M,从第一个小孩开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m的值。从他在顺指针方向上的下一个人开始重新从你报数,如此下去,直到所有的小孩全部出列,最后出列的小孩为获胜者。编写一个程序输入小孩人数n,每一个小孩的初始密码及起始报数上限值m,输出小孩子出列顺序及最后的获胜者。

#include<iostream>
using namespace std;
struct JoseEx
{
int code;
int password;
JoseEx   *next;
};
int main()
{
JoseEx  *head, *p1, *p2;
int boys, m, i;
cout << "请输入小孩人数: ";
cin >> boys;
cout << "请依次输入" << boys << "个小孩的密码值: " << endl;
head = new JoseEx;
cin >> m;
head->code = 1;
head->password = m;
p2 = head;
for (i = 2; i <= boys; i++)//创建循环链表
{
p1 = new JoseEx;
cin >> m;
p1->code = i;
p1->password = m;
p2->next = p1;
p2 = p1;


}
p2->next = head;
cout << "请输入初始报数上限值: ";
cin >> m;
cout << "出圈顺序为: " << endl;
p1 = head;
while (p1->next != p1)
{
i = 1;
while (i < m)
{
i++;
while (i < m)
{
i++;
p2 = p1;
p1 = p1->next;
}
p2->next = p1->next;
cout << p1->code << " ";
m = p1->password;
delete p1;
p1 = p2->next;


}
cout << p1->code << endl;
i = p1->code;
delete p1;
cout << "优胜者为: " << endl;
return 0;
}


}
 

0 0
原创粉丝点击