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.