题目1188:约瑟夫环
约瑟夫环:点击打开链接
/*********************************
* 日期:2013-2-14
* 作者:SJF0115
* 题号: 九度OJ 题目1188:约瑟夫环
* 来源:http://ac.jobdu.com/problem.php?pid=1188
* 结果:AC
* 来源:2003-2005年华中科技大学计算机研究生机试真题
* 总结:先将所有人进行编号,如果被删除就将其编号设置为0。 循环直到队列中只剩0个人
**********************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int n,i,j,people,index,remain,ID;
int DeleteID[3001];
while(scanf("%d %d",&people,&ID) != EOF){
int Flag[3001] = {0};//标记1为删除
index = 0;
remain = people;
while(remain >= 1){
for(j = 0;j < people;j++){
//对没有标记为1的报数
if(Flag[j] == 0){
//报数
index ++;
//报ID者退出圈外
if(index == ID){
//退出圈外
Flag[j] = 1;
//重新报数
index = 0;
DeleteID[remain-1] = j+1;
remain --;
}//if
}//if
}//for
}//while
//输出每个退出人的原序号
for(j = people-1;j >= 0;j--){
if(j == 0){
printf("%d\n",DeleteID[j]);
}
else{
printf("%d ",DeleteID[j]);
}
}
}//while
return 0;
}
约瑟夫环:点击打开链接