zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    约瑟夫问题

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    n个人想玩残酷的死亡游戏,游戏规则如下: 

    n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

    请输出最后一个人的编号。

    输入

    输入n和m值。

    输出

    输出胜利者的编号。

    示例输入

    5 3

    示例输出

    4

    提示

    第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
    View Code
    #include <stdio.h>
    
    int IsEnd(int a[],int n);//测试就剩一个入?如果是。就返回序号。否则返回0
    
    
    int main()
    {
        int n,m;
        int a[100];
        int i=0,j=0;
        int t;
        scanf("%d %d",&n,&m);
        for(i=1; i<=n; i++)//数值便是他们各自的编号
        {
            a[i]=i;
        }
        i=0;
        while( (t=IsEnd(a,n)) == 0)//当剩下人数超过1个时
        {
            i++;
            if(i == n+1)//数到最好一个人后从头循环
                i=1;
            if( a[i] != 0)//如果没有被杀掉
            {
                j++;
                if(j % m == 0)//没有被杀掉的数到m
                    a[i] = 0;//值为0,表示被杀掉
            }
        }
        printf("%d\n",a[t]);
    
        return 0;
    }
    
    int IsEnd(int a[],int n)
    {
        int t=0,m=0;
        for(int i=1; i<=n; i++)
        {
            if(a[i] != 0)
            {
                t=i;
                m++;
            }
            if(m > 1)
                return 0;
        }
        return t;
    }

    //链表做法

    View Code
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <math.h>  
      
    typedef struct Node{  
        int data;  
        struct Node *next;  
    }Node, *Link;  
      
    Link create(int n){  
        Link head, p, tail;  
        int i;  
        tail = head = (Link)malloc(sizeof(Node));  
        head->next = NULL; head->data = 1;  
        for(i=1; i<n; i++){  
            p = (Link)malloc(sizeof(Node));  
            p->data = i+1;  
            //p->next = tail->next;  
            //tail->next = p;  
            tail->next = p;  
            tail = p;  
        }  
        p->next = head;  
        return head;  
    }  
      
    void print(Link head){  
        Link p = head->next;  
        while(p->next){  
            printf("%d ", p->data);  
            p = p->next;  
        }  
        printf("%d\n", p->data);  
    }  
      
    int main(){  
        Link head, tail, p;  
        int n, m, i=0;  
        scanf("%d %d", &n, &m);  
        tail = p = head = create(n);  
        while(tail->next != head){  
            if(tail->next == head) break;  
            tail = tail->next;  
        }  
        do{  
            i++;  
            if(i % m == 0) {tail->next = p->next; free(p); p = tail->next;}  
            else{ tail = tail->next; p = p->next;  
            }  
        }while(p->next != p);  
        printf("%d\n", p->data);  
        return 0;  
    }  
    
    
  • 相关阅读:
    第四周助教小结
    java课程总结
    第十四周总结
    第十三周实验报告
    第十二周课程报告
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2883530.html
Copyright © 2011-2022 走看看