奇特的艺术品(数据结构小实验)

题目四: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

#include<iostream>
#include<malloc.h>
using namespace std;

struct node{
	int data;
	node* next;
}; 
node* find(int k,node *head){
	node* temp=head;
	int t=0;	
	while(t<k){
		temp=temp->next;
		t++;	
	}
	return temp;
}//用以寻找结点的小函数,因为会多次复用
int main()
{
	int n,k,a,b,c;
	while(~scanf("%d%d",&n,&k))
	{	
		node* head=(node*)malloc(sizeof(node)); 
		head->next=NULL;
		for(int i=n;i>0;i--){
			node* p=(node*)malloc(sizeof(node));
			p->data=i;
			p->next=NULL;
			p->next=head->next;
			head->next=p;	
		}//头插建立链表
		node* left,*right,*tar;
		int t;
		for(int i=0;i<k;i++){
			scanf("%d%d%d",&a,&b,&c);
			node *temp;		
			left=find(a-1,head);
			temp=left->next;
			right=find(b-1,head)->next;
			left->next=right->next;
			tar=find(c,head);
			right->next=tar->next;
			tar->next=temp;		
		}
		for(int i=0;i<10&&i<n;i++){
			printf("%d\n",head->next->data);
			head=head->next;
		}
	}
	return 0;
}

思路

其实思路意外的简单,无非是顺序表和线性表两种做法。
采用链表主要是空间利用率高一点,单纯论时间复杂度的话相差不大(其实数组更快一点,可以两组数组滚动相互复刻)。
可以把链表看作吊坠,指针看成钉子,先保证吊坠不会有丢失的,再进行其他操作,这样就不太容易丢失出意外了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值