首页 > 代码库 > 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 }
POJ3750:: 小孩报数问题(约瑟夫问题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。