该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
是约瑟夫环问题,n个孩子围一圈,从一数到m个,第m个退出,继续从1数到m…预测哪个孩子胜出,程序如下:#include "iostream"
using namespace std;
struct child
{
int num;
child *link;
};
void init(int n);// 初始化函数
void gamestart(int n, int m);// 模拟游戏函数
child *head;// 链表头
child *present;// 当前结点
child *end;// 链表尾
int main()
{
int n, m;
cout << "请输入孩子的人数n=";
cin >> n;
cout << "请输入正整数m=";
cin >> m;
init(n);
gamestart(n, m);
cout << "第" << present->num << "个孩子将获得胜利!" << endl;
delete present;
return 0;
}
void init(int n)
{
head = new child;
head->num = 1;
present = head;
for (int i = 1; i < n; i++)
{
present->link = new child;
present->link->num = i + 1;
present = present->link;
}
present->link = head;
end = present;
present = head;
}
void gamestart(int n, int m)
{
child *pGuard = end;// 指向待删除结点的前驱结点,起初应指向表尾
while (n != 1)
{
for (int j = 1; j < m; j++)
{
pGuard = present;
present = present->link;
}
pGuard->link = present->link;
delete present;
present = present->link;
n--