随笔 - 7  文章 - 27  trackbacks - 0
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿

随笔档案(7)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

之前已经写在CSDN上了,现在也转到这边一下。
问题描述: 
设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M个人时,此人出圈,再从他的下一个人重新开始1到M的报数,如此进行下去直到所有的人都出圈为止。现要打印出出圈次序。 

输入:n 游戏总人数  s 报数的起始编号  m 报数的数值    
输出:p 指向长度为n的数组,出圈次序保存在p指向的数组中
示例 
   n=7 s=2 m=3  出圈次序为:4 7 3 1 6 2 5
   n=3 s=1 m=2  出圈次序为:2 1 3   

 1#include <iostream>
 2#include <vector>
 3using namespace std;
 4/*
 5n=7 s=2 m=3  出圈次序为:4 7 3 1 6 2 5 
 6n=3 s=1 m=2  出圈次序为:2 1 3  
 7*/

 8void process(int n,int s,int m)
 9{
10    if(n<=0 || (s<1 || s>n) || m<=0)
11    {
12        cout<<"E8"<<endl;
13        return;
14    }

15    int MAX=n;
16    int start=s;
17    int step=m;
18    vector<int> men;
19    vector<int> outputList;
20    men.clear();
21    outputList.clear();
22    for (int i=0;i<MAX;i++)
23        men.push_back(i+1);
24
25    start=start-1;
26
27    int k=0;
28    while(!men.empty())
29    {
30        k=(start+step-1)%MAX;
31        outputList.push_back(men[k]);
32        men.erase(men.begin()+k);
33        MAX=men.size();
34        if (!MAX)
35            break;
36        start=k%MAX;
37    }

38    for (vector<int>::iterator it=outputList.begin();it!=outputList.end();it++)
39        cout<<*it<<" ";
40    cout<<endl;
41}

42int main()
43{
44    int n,s,m;
45    while(cin>>n>>s>>m)
46    {
47        process(n,s,m);
48    }

49    return 0;
50}
posted on 2011-03-10 17:41 乔宁博 阅读(737) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理