码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-30 20:28:42      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

又一次因为一个小错误,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:: 小孩报数问题(约瑟夫问题)

标签:

原文地址:http://www.cnblogs.com/fu11211129/p/4194343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!