約瑟夫問題
Problem Description
n個人進行編號,分別從1到n,排成一個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的一個人是勝利者。
請輸出最後一個人的編號。
Input
Output
Sample Input
5 3
Sample Output
4
Hint
解題思路:循環鏈表,比較經典的題目,建立好鏈表之後,把頭尾用指針連起來,進入時候可以用一個頭結點進行接入,還是比較好理解的,不過代碼實現的時候,遇到了一些問題,就是指針越界和沒有清理刪除元素的問題。
AC代碼:
#include <iostream>
#include <bits/stdc++.h>
#define maxsize 1000010
using namespace std;
typedef struct node //結構體定義
{
int date;
struct node *next;
} linkList;
linkList* createLink(int n) //創建循環鏈表
{
linkList *head;
linkList *p, *q;
head = (linkList *)malloc(sizeof(linkList));
head->date = 1;
head->next = NULL;
p = head;
int i;
for(i = 2; i <= n; i++)
{
q = (linkList *)malloc(sizeof(linkList));
q->date = i;
q->next = head;
p->next = q;
p = p->next;
}
return head;
}
int survivor(linkList *head, int x) //遞歸找到倖存者
{
int i;
linkList *p, *q;
p = head;
q = p->next;
if(q != p)
{
while(q->next != head)
{
q = q->next;
}
for(i = 1; i < x; i++)
{
p = p->next;
q = q->next;
}
q->next = p->next;
p = p->next;
return survivor(p,x);
}
return p->date;
}
int main()
{
linkList *head;
int n, m;
int sur;
scanf("%d %d",&n, &m);
head = createLink(n);
sur = survivor(head,m);
printf("%d\n", sur);
return 0;
}