约瑟夫环问题

今天在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值