约瑟夫问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Sample Input
5 3
Sample Output
4
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef struct st
{
int date;
struct st*next;
}linklist;
linklist*creat(int n)
{
linklist*head,*tail,*p;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
head->date=1; //头节点也要赋值了
tail=head;
for(int i=2;i<=n;i++)
{
p=(linklist*)malloc(sizeof(linklist));
p->date=i;
p->next=NULL;
tail->next=p;
tail=p;
}
tail->next=head; //首尾相连,so easy!
return head;
}
int kill(linklist*L,int m)
{
linklist *p;
p=(linklist*)malloc(sizeof(linklist));
p->next=L;
/*************************************************************
若p不申请空间,p->next=L语句就报错
主要是因为指针没有指向可用的内存地址或没有分配地址
你定义了一个指针变量,只能用来保存地址,如果这个地址所指向的空间不是系统分配给它的,那么你对这块内存的赋值是非法的
***************************************************************/
/*******************
p=L;
while(p->next!=L)
p=p->next;
*******************/
while(p->next!=p)
{
for(int i=1;i<=m-1;i++)
{
p=p->next;
}
p->next=p->next->next; //思考如果让p=p->next->next,假设此时p=4,
//p=p->next->next,所以p就等于6,然而就没有谁来记结点6 的地址,所以不行。
}
return p->date;
}
int main()
{
linklist*L;
int n,m;
scanf("%d%d",&n,&m);
L=creat(n);
int k=kill(L,m);
printf("%d\n",k);
return 0;
}