C语言用数组解决约瑟夫环问题

       在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?

        用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题。采用循环链表的方法,以后详述。本节主要讲解如何用数组的方式解决约瑟夫环的问题。

        程序如下所述:

#include<stdio.h>
#define LEN 41

void main(){
    int a[LEN];
    for(int i=0;i<LEN;i++){a[i] = 1;}   // 数组初始化,1:表示为活着;0:表示自杀

    int leftCount = LEN;                // 计数器leftCount:计数剩下的人
    int index = 0,count = 0;            // 1.数组下标index;2.循环计数器count

    while(leftCount>2){                 // 当还剩下两个人结束

        if(a[index] == 1){ 
            count++; 
            if(3 == count){             // 计数到3,1.自杀;2.循环计数器count重新开始计数;3.计数器leftCount减1
                a[index] = 0;
                count = 0;
                leftCount--;
            }
        }
        index++;

        if(index == LEN){index = 0;}    // 当到数组尾,数组下标index置零,重新开始
    }

    for(int j=0;j<LEN;j++){             // 输出结果
        if(1 == a[j]){ printf("剩下两个人为第%d个\n",j+1); }
    }
}

             输出结果为:

2016-01-03_111246
posted @ 2016-01-03 11:12  niqiulin  阅读(11697)  评论(0编辑  收藏  举报