首页 > 代码库 > POJ3750:: 小孩报数问题(约瑟夫问题)

POJ3750:: 小孩报数问题(约瑟夫问题)

又一次因为一个小错误,POJ上Wrong Answer了无数次。。。。。

在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语。。。。

本题wo采用模拟方法:

技术分享
 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 struct child{ 6     char name[16]; 7     int id; 8     //child(string, int); 9 }cd[100];10 void init(int n){11     char s[16];12     for(int i=1;i<=n;i++){13         scanf("%s",cd[i].name);14         cd[i].id=0;15     }16 }17 int main(){18     int n,w,s; char c;19     scanf("%d",&n);20     init(n);21     scanf("%d%c%d",&w,&c,&s);22     cd[w].id=1;23     int pt=w;24     int kill=0;25     while(true){26         int step=s%(n-kill)-1;27         if(step<=0) step=step+n-kill;28         /*29             这里的取模运算是考虑到s值可能非常大,如果这样的话,模拟报数过程1。。。。s将会非常30             耗时间。31             至于为什么这么取模,自己算一算就明白了。 32         */33         for(int i=1;i<=step;i++){34                 int ptr=pt%n+1;35                 while(cd[ptr].id==-1){//要跳过已经被kill的元素 36                     ptr=ptr%n+1;37                 }38                 cd[ptr].id=cd[pt].id+1;39                 pt=ptr;40         }//这里的pt指向的就是我们要删除的元素 41         cd[pt].id=-1;//将id赋值为-1,相当于删除动作 42         printf("%s\n",cd[pt].name);43         kill++;44         if(kill==n) break; //已经清空,跳出循环 45         int ptr=pt%n+1;46         while(cd[ptr].id==-1){47                     ptr=ptr%n+1;48         }49         cd[ptr].id=1;50         pt=ptr;51             52     }53     //system("pause");54     return 0;55 }
View Code

 

POJ3750:: 小孩报数问题(约瑟夫问题)