uva133----约瑟夫类问题

code:

#include <cstdio>
//经过如果不是空格+1,循环下去,当碰到i==k时,返回值,退出 
//一个顺时针,和一个逆时针

int s[25];
int n; 
//计算出其经过旋转得到的值,返回 
int compute(int p,int d,int k){//顺时针   参数:p:初始值 算的值,d:方向 逆时针+1,顺时针-1,k:跳跃值  
            while(k--){
            	  //循环 
            	  //条件
                 do{
                 	p = (p+d+n-1)%n+1;
                 }while(s[p] == 0);       	            
            }
            return p;
} //返回值 : 找到的值  

int main(){
        int k,m;
            while(scanf("%d %d %d",&n,&k,&m)==3&&n){
            	    int p = n,q = 1;
            	    int len = n;
            	        for(int i = 1;i<= n;i++)
            	            s[i] = i;
					    while(len){
                               p = compute(p,1,k);
							   q = compute(q,-1,m);
							   printf("%3d",p);
							   len--;
							   if(q != p){
   							         printf("%3d",q);
									 len--;	
   							   }
							   if(len)printf(",");  
							   s[p] = s[q] = 0;    						   
    					}   
			   printf("\n");			 
            }		    	
	return 0;
}

  

posted on 2014-12-07 23:14  lzm420241  阅读(82)  评论(0)    收藏  举报

导航