欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

题目四 艺术品

程序员文章站 2022-07-11 12:22:34
...

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

 

  数据结构的作业,我用的方法算是很笨的了,并且我也没经历过算法训练,所以代码写的很差,仅供参考。

  整体思路就是用链表保存艺术品,节点定义为:

  

typedef struct Lnode{ 
	int num;
	Lnode* next;
}node,*LinkList;

  num表示艺术品编号。

  整体代码如下:

  1 /*
  2 zp
  3 zzti
  4 2012/10/06
  5 */
  6 #include<iostream>
  7 using namespace std;
  8 typedef struct Lnode{
  9     int num;  //艺术品编号
 10     Lnode* next;
 11 }node,*LinkList;
 12 void CreatList(LinkList& l,int n)  //初始化链表,给所有节点赋值
 13 {
 14     node* p=new node;
 15     p->next=NULL;
 16     p->num=0;
 17     l=p;
 18     for(int i=0;i<n;i++)
 19     {
 20         node* q=new node;
 21         q->num=i+1;
 22         q->next=NULL;
 23         p->next=q;
 24         p=p->next;
 25     }
 26 }
 27 
 28 void Move(LinkList& l,int a ,int b,int c){
 29     node* p=l; 
 30     node* headpre,*tailpre;  //a的前一个位置和b的前一个位置
 31     int i=0;
 32     //第一次遍历,找出ab的位置
 33     while(p->next!=NULL)
 34     {
 35         i++;
 36         if(i==a)
 37         {
 38             headpre=p;   
 39         }
 40         if(i==b)
 41         {
 42             tailpre=p;;
 43         }
 44         p=p->next;
 45     }
 46     node* head=headpre->next; //a的位置
 47     node* tail=tailpre->next;  //b的位置
 48     headpre->next=tail->next;
 49 
 50     //第二次遍历,将抽出的链表重新插入到合适的位置
 51     p=l;i=0;
 52     while(p->next)
 53     {
 54         if(i==c)
 55         {
 56             node* q=p->next;  //将链表插入
 57             p->next=head;
 58             tail->next=q;
 59         }
 60         i++;p=p->next;
 61     }
 62 }
 63 
 64 void PrRes(LinkList l) { //PrintResult
 65     int i=0;
 66     node* p=l->next;
 67     while(i<10)
 68     {
 69         cout<<p->num<<endl;
 70         i++;
 71         p=p->next;
 72     }
 73 }
 74 
 75 
 76 int main()
 77 {
 78     
 79     int n,k,a,b,c,t1,t2,t3;
 80     cout<<"请输入n,k:"<<endl;
 81     do{
 82         cin>>t1>>t2;
 83         if(t1<10||t1>20000||t2<1||t2>>1000)
 84         {
 85             cout<<"输入数据超过规定范围,请重新输入!"<<endl;
 86         }
 87         else break;
 88         
 89     }while(1);
 90     n=t1;k=t2;
 91     LinkList l;
 92     CreatList(l,n);
 93     for(int i=0;i<k;i++)
 94     {
 95         cout<<"请输入要搬运的范围以及放置位置:"<<endl;
 96         do{
 97             cin>>t1>>t2>>t3;
 98             if(t1<1||t1>n||t2<1||t2>n||t1>t2||t3<0||t3>(n-(t2-t1+1)))
 99             {
100                 cout<<"输入数据有误,请重新输入!"<<endl;
101             }
102             else break;
103         }while(1);
104         a=t1,b=t2,c=t3;
105         Move(l,a,b,c);
106     }
107     PrRes(l);
108     return 0;
109 }
110     

 

 

转载于:https://www.cnblogs.com/csonezp/archive/2012/10/06/2712685.html