今天在ACM上刷题时,遇到一道约瑟夫环问题,开始失败了好多次,最后终于成功了。由此在此记录一下自己的心得。
首先问题如下:
Description
n个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号。
Input
多组测试数据,输入n和m的值,m,n都在1-150之间。
Output
输出胜利者的编号。
Sample Input
5 3
1 1
Sample Output
4
1
Hint
第一组测试数据中:第一轮:3被杀;第二轮:1被杀;第三轮:5被杀;第四轮:2被杀;4获胜。
解决约瑟夫环问题步骤,大体如下:
1 建立具有n个无头链结点的循环链表
2 确定第一个报数人的位置
3 不断删除链结点直至链表为空
下面附上我自己写的代码,如果哪里有错,希望大家指正,谢谢!
#include <iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef struct list
{
int number;
struct list *next;
}node;
int main()
{
node *p,*q,*head;
int i,m,n,count=1;
while(scanf("%d %d",&n,&m)!=EOF)
{
head=p=(node*)malloc(sizeof(node));
for(i=0;i<n;i++)
{
q=(node*)malloc(sizeof(node));
q->number=i+1;
p->next=q;
p=q;
}
p->next=head->next;
free(head);
p=p->next;
while(p!=p->next)
if(count==m)
{
q=p->next;
p->number=q->number;
p->next=q->next;
free(q);
count=1;
}
else
{
p=p->next;
count++;
}
printf("%d\n",p->number);
getchar();
}
return 0;
}