Dr.Kong的艺术品
题目
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 |
15 2 4 9 2 10 13 7 |
1 2 4 5 6 7 8 10 11 12 |
12 3 6 10 4 3 8 1 7 11 0 |
9 2 10 5 11 1 3 4 6 7 |
解答
本道题可用线性表的链式存储结构来解决,其的解题思想是用尾插法建立一个链表head存储数据,查找a节点之前的那个节点和b节点,将a和b之间的这一段数据用链表L单独存储起来(相当于暂时从此链表中删除),然后从删除L之后的head链表中查找c的节点,之后将链表L整体插入到链表head中,最后输出前十个数据即可。
代码
#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct node{
int data;
struct node* next;
}*LinkList;
int main()
{
int n,k;
int i,j,m;
int a,b,c;
LinkList head,tail,p,q,L,r,s,t;
while(cin>>n>>k)
{
head=(LinkList)malloc(sizeof(node));
tail=(LinkList)malloc(sizeof(node));
head->next=NULL;
tail=head;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(node));
p->data=i;
if (i==1)
head->next=p;
else
tail->next=p;
tail=p;
}
tail->next=NULL;
for(i=0;i<k;i++)
{
j=1,m=0;
t=L=head;
cin>>a>>b>>c;
while(j<a) //查找a前一个节点
{
L=L->next;
j++;
}
q=L->next;
s=q;
while(j<b) //查找b本身
{
s=s->next;
j++;
}
L->next=s->next;
r=t;
while(m<c) //查找c本身
{
r=r->next;
m++;
}
s->next=r->next;
r->next=q;
}
head=head->next;
for(i=0;i<n&&i<10;i++)
{
cout<<head->data<<endl;
head=head->next;
}
}
return 0;
}