vvvvcat

导航

 

Joseph 问题与线性数据结构解决方案** Joseph 问题(约瑟夫环问题)

       是一个经典的数学问题,需要从围成环形的人群中按特定规则逐个淘汰,直到剩下最后一人。虽然问题本身具有环形特征,但我们可以通过线性数据结构(如数组、链表)结合特定算法来高效解决。下面将详细介绍不同线性数据结构的解决方案。 首先是数组模拟方法,数组模拟法分为两步 
 
1.模拟形态 

2.模拟状态

#include <stdio.h>

// 数组模拟约瑟夫环问题
int joseph_array(int n, int m) {
    // 创建数组,1表示存活,0表示淘汰
    int people[n];
    for (int i = 0; i < n; i++) {
        people[i] = 1;
    }
    
    int count = n;  // 剩余人数
    int index = 0;  // 当前位置
    
    while (count > 1) {
        int step = 0;
        // 寻找第m个存活的人
        while (step < m) {
            if (people[index] == 1) {
                step++;
            }
            if (step == m) {
                // 淘汰当前人
                people[index] = 0;
                count--;
                break;
            }
            // 模拟环形,到达末尾后回到开头
            index = (index + 1) % n;
        }
    }
    
    // 找到最后存活的人
    for (int i = 0; i < n; i++) {
        if (people[i] == 1) {
            return i + 1;  // 转换为1开始的编号
        }
    }
    return -1;
}

int main() {
    // 示例:7人,报数到3淘汰
    int result = joseph_array(7, 3);
    printf("最后存活的人编号: %d\n", result);
    return 0;
}

 

posted on 2025-06-19 21:47  vvvvcat  阅读(16)  评论(0)    收藏  举报