SDUTOJ(1197)約瑟夫問題

約瑟夫問題

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

n個人想玩殘酷的死亡遊戲,遊戲規則如下:

n個人進行編號,分別從1到n,排成一個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的一個人是勝利者。

請輸出最後一個人的編號。

Input

輸入n和m值。

Output

輸出勝利者的編號。

Sample Input

5 3

Sample Output

4

Hint

第一輪:3被殺第二輪:1被殺第三輪:5被殺第四輪:2被殺 

解題思路:循環鏈表,比較經典的題目,建立好鏈表之後,把頭尾用指針連起來,進入時候可以用一個頭結點進行接入,還是比較好理解的,不過代碼實現的時候,遇到了一些問題,就是指針越界和沒有清理刪除元素的問題。

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章