Dr.Kong设计了一件艺术品,该艺术品由N个构件堆叠而成,N个构件从高到低按层编号依次为1,2,……,N。艺术品展出后,引起了强烈的反映。Dr.Kong观察到,人们尤其对作品的高端部分评价甚多。
狂热的Dr.Kong一激动,对组成该艺术品的N个构件重新组合,比如:把第6层到第12层的构件搬下来,想一想,然后整体放到剩下构件的第7层下面;过一会儿,又把第2层到第9层的构件搬下来,整体放到剩下构件的第1层下面等等。于是,Dr.Kong在进行了连续若干次“搬来搬去”后,还是这N个构件,又诞生了一件新的艺术品。
编程:请输出新的艺术品最高十层构件的编号。
【标准输入】
第一行: N K 表示构件的总数和“搬来搬去”的总次数
第2~K+1行:A B C 表示要搬动的构件(即从第A层到第B层)整个放在第C层下面;
如果C等于0,则要搬动的构件将放到最高层。
【标准输出】
由十行组成,分别为组成新艺术品的第一层到第十层构件的编号。
【约束条件】
(1) 10≤N≤20000 1≤k≤1000
(2) 1≤A≤B≤N, 0≤C≤N-(B-A+1)
【 样 例 】
标准输入 |
标准输出 |
13 3 6 12 1 2 9 0 10 13 8
|
6 7 8 9 10 11 12 2 3 4 |
代码:
建立链表,结构体里有编号和层数,每次移动,都将层数重新排列,全部移动完后输出移动后的编号,具体如下:
#include<stdio.h> #include<malloc.h> #define LEN sizeof(floor) int n=0; struct floor { int i; //层数 int num; //编号 floor *next; }; struct floor *creat(int N) //创建链表 { struct floor *head; struct floor *p1,*p2; n=0; int t=1; p1=p2=(struct floor*)malloc(LEN); p1->i=t; p1->num=t; head=NULL; while(t<N) { n++; t++; if(n==1)head=p1; else p2->next=p1; p2=p1; p1=(struct floor *)malloc(LEN); p1->i=t;p1->num=t; } p2->next=NULL; return head; } void print(floor *head) //输出链表 { floor *p; p=head; int n=10; while(n--) { printf("%d\n",p->num); //输出编号 p=p->next; } } struct floor *move1(floor *head,int a,int b,int c) //第一种情况 { floor *p,*pa,*pb,*pc,*pp; //将搬出的构件移动到上面 p=head; while(p->i!=c&&p->next!=NULL) //查找c节点 p=p->next; pc=p; while(p->i!=a&&p->next!=NULL) //查找a节点 { pp=p; //记录a节点前面的节点 p=p->next; } pa=p; while(p->i!=b&&p->next!=NULL) //查找b节点 p=p->next; pb=p; pp->next=pb->next; //指针指向改变 pb->next=pc->next; //从而改变顺序 pc->next=pa; return head; } struct floor *move2(floor *head,int a,int b,int c) //第二种情况 { //将搬出的构件移动到下面 floor *p,*pa,*pb,*pc,*pp; p=head; while(p->i!=a&&p->next!=NULL) { pp=p; //记录a节点前面的节点 p=p->next; } pa=p; while(p->i!=b&&p->next!=NULL) p=p->next; pb=p; if(c==0) { pp->next=pb->next; pb->next=head; head=pa; return head; } while(p->i!=c&&p->next!=NULL) p=p->next; pc=p; pp->next=pb->next; //指针指向改变 pb->next=pc->next; pc->next=pa; //从而改变顺序 return head; } struct floor *rank(floor *head) //对层数排序 { floor *p; p=head;int t=1; //每次移动后,将层数由高到低从1排序 while(p!=NULL) { p->i=t; p=p->next; t++; } return head; } int main() { int N,K; int a,b,c; struct floor *head; scanf("%d%d",&N,&K); head=creat(N); while(K--) { scanf("%d%d%d",&a,&b,&c); if(c<a&&c!=0) //将搬出的构件移动到上面 head=move1(head,a,b,c); else if(c>b||c==0) head=move2(head,a,b,c);//将搬出的构件移动到下面 head=rank(head); //,包括移动到最上面 } print(head); return 0; }