ytu 1067: 顺序排号(约瑟夫环)

1067: 顺序排号

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 31  Solved: 16
[Submit][Status][Web Board]

Description

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

Input

初始人数n

Output

最后一人的初始编号

Sample Input

3

Sample Output

2

HINT

 

Source


 
  水题,约瑟夫环
  最近快考试了,趁机刷刷水题,正好夯实一下基础。
  思路:用链表做的,写的时候很容易出问题。
  代码
 1 #include <iostream>
 2 
 3 using namespace std;
 4 struct Node{
 5     int data;
 6     Node* next;
 7 };
 8 int main()
 9 {
10     Node *head = new Node;
11     Node *p = head;
12     int i,n;
13     cin>>n;
14     for(i=1;i<=n;i++){
15         if(i==1){
16             p->data=i;
17             p->next = NULL;
18             continue;
19         }
20         //cout<<p<<endl;
21         Node *t = new Node;
22         t->data = i;
23         t->next = NULL;
24         p->next = t;
25         p = p->next;
26     }
27     p->next = head;
28     p = head;
29     /* 输出测试
30     int t = head.data;
31     do{
32         cout<<p->data<<' ';
33         p = p->next;
34     }while(p->data!=t);
35     cout<<endl;
36     */
37     //模拟报数
38     int num = 1;
39     while(1){
40         if(num==2){
41             if(p->next->next==p)
42                 break;
43             else{
44                 Node * t = new Node;
45                 t = p->next;
46                 p->next = t->next;
47                 //cout<<t->data<<endl;
48                 delete(t);
49                 p = p->next;
50                 num=1;
51             }
52         }
53         else{
54             p = p->next;
55             num++;
56         }
57     }
58     cout<<p->data<<endl;
59     return 0;
60 }

 

Freecode : www.cnblogs.com/yym2013

posted @ 2014-06-09 12:32  Freecode#  阅读(282)  评论(0编辑  收藏  举报