POJ 2746 约瑟夫问题

来源:互联网 发布:复制文件夹网络共享 编辑:程序博客网 时间:2024/05/22 17:48

题目

总时间限制: 1000ms 内存限制: 65536kB
描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0

输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
6 2
12 4
8 3
0 0
样例输出
5
1
7

思路

水题,用数组模拟一个环就可以了。
但是,这道题debug了好久才过,原因是步数的index和遍历的index没有对应上。
细节,想好流程再写代码!

代码

#include<iostream>#include<cstring>using namespace std;int main(){    int n, m;    while(cin>>n>>m){        int a[301];        memset(a, 0, sizeof(a));        if(n == 0 && m == 0){            return 0;        }        int start = -1;        int num_left = n;        int step_count = -1;        int i;        while(num_left > 1){            i = start;            while(step_count < m - 1){                i = (i + 1) % n;                if(a[i] == 0){                    step_count += 1;                }            }            num_left -= 1;            step_count = -1;            start = i;            a[i] = 1;        }        for(i = 0; i < n; i ++){            if(a[i] == 0){                cout<<i + 1<<endl;            }        }    }    return 0;} 
原创粉丝点击