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;

}

posted @ 2013-10-15 19:38  仰望天kong  阅读(287)  评论(0编辑  收藏  举报