(顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
/* * POJ_1591_2.cpp * * Created on: 2013年10月31日 * Author: Administrator */ #include <iostream> #include <cstdio> using namespace std; const int maxn = 55; int cards[25]; bool position[maxn]; int main(){ int participants,lucky; int counter = 1; while(scanf("%d%d",&participants,&lucky)!=EOF){ int i,j; for(i = 0 ; i < 20 ; ++i){ scanf("%d",&cards[i]); } int left_num = participants; memset(position,1,sizeof(position)); for(i = 0 ; left_num > lucky ; ++i){//在left_num>lucky的情况下,不断的扫卡片数组 int k = 0;//标记数了多少个人 for(j = 0 ; (j <participants) && left_num > lucky ; ++j ){//扫position[]数组 if(position[j]){//如果这一个人还在队列里面 if(++k == cards[i]){//如果书到了卡片中要求的数字 --left_num;//幸存者的人数-1 k=0; position[j] = false;//那个人出队 } } } } if(counter != 1){ printf("\n"); } printf("Selection #%d\n",counter++); for(i = 0 ; i < participants ; ++i){ if(position[i]){ printf("%d ",i+1); } } printf("\n"); } return 0; }