Post

hdu1276.新兵队列

hdu1276.新兵队列

Problem Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//计算链表长度的函数
int countsize(Node* s){
	Node*p=s;
	int cnt=0;
	while(p!=nullptr){
		p=p->next;
		cnt++;
	}
	return cnt;
}

int main(){
    int N;
    cin>>N;

    for(int i=0;i<N;i++){
        int n;
        cin>>n;
        Node* head=new Node(1);
        Node* rear=head;
		
		//尾插法创建链表(略)
        
        int cnt=1;//用来标记当前是第奇/偶数次报数

		while (countsize(head)>3)//终止条件
        {
            if(cnt%2==0){//第偶数次循环——报3的出列
                Node* p1=head->next;
                Node* p2=head->next;
                while (p1->next)
                {
                    p2=p1->next->next;
                    p1->next=p2;
                    if(p2){
                        p1=p2;
                        if(p2->next){
                            p2=p2->next;
                            p1=p2;
                        }else{
                        	break;
						}
                    }else{
						break;
					}
                }
                
            }
            else if(cnt%2==1){//第奇数次循环——报2的出列
                Node* p1=head;
                Node* p2=head;
                while (p1)//检查指针合法性
                {
                    if(p1->next){//检查指针合法性
                        p2=p1->next->next;
                        p1->next=p2;
                        p1=p2;  
                    }else{
                    	break;//退出while循环用break
					}
                }
            }
            cnt++;
        }
        
        //打印结果(略)
}

Experience

  • 跳出while循环用break

  • Runtime Error:指针错误

1
while (countsize(head)>3)//终止条件

这里我一开始写的是

1
while(head->next->next->next!=null)

显然这么一长串的”next”可能会导致Re,比如head->next为空,就不能出现head->next->next;然后我想用好几个if语句来避免Re:if(head),if(head->next)...但好像不可行,而且太麻烦,所以更好的方法是写一个countSize(Node* s)函数用来计算链表长度!

  • 还有这里,也有Re的风险,不过这里我处理得不错
1
2
3
4
5
6
7
8
9
10
while (p1)//检查指针合法性
                {
                    if(p1->next){//检查指针合法性
                        p2=p1->next->next;
                        p1->next=p2;
                        p1=p2;  
                    }else{
                    	break;//退出while循环用break
					}
                }
This post is licensed under CC BY 4.0 by the author.