堆积木
蒜头君有 n 块积木,编号分别为 1 到 n。一开始,蒜头把第 i 块积木放在位置 i。蒜头君进行 m 次操作,每次操作,蒜头把位置 b 上的积木整体移动到位置 a 上面。比如 1 位置的积木是 1,2 位置的积木是 2,那么把位置 2 的积木移动到位置 1 后,位置 1 上的积木从下到上依次为 1,2。
输入格式
第一行输入 2 个整数 n,m (1≤n≤10000,0≤m≤10000)。
接下来 m 行,每行输入 2 个整数 a,b (1≤a,b≤n),如果a,b 相等则本次不需要移动。
输出格式
输出 n 行,第 i 行输出位置 i 从下到上的积木编号,如果该行没有积木输出一行空行。
实现代码
这道题是我第一次用广义表,应该还是能优化不少的,bug改着改着就解决了,没什么实感(?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include<iostream> #include<stdlib.h> using namespace std; typedef struct node { int data; int top; struct node* link; struct node* next; }lsnode,*lslink; lslink listscreat(int n) { lslink H,p,r,q; H=(lslink)malloc(sizeof(lsnode)); H->next=NULL; r=H; for(int i=1;i<=n;++i) { p=(lslink)malloc(sizeof(lsnode)); q=(lslink)malloc(sizeof(lsnode)); q->data=i; p->data=i; r->next=p; p->link=q; q->next=NULL; p->next=NULL; p->top=1; r=p; } return H; } lslink findit(lslink H,int n) { for(int i=1;i<=n;++i) H=H->next;
return H; } lslink finaone(lslink H) {
lslink p=H; for(int i=0;i<H->top;++i) p=p->link;
return p; } int main() { int n,m,a,b; cin>>n>>m; lslink H=listscreat(n); lslink r,s,p=H->next; for(int i=1;i<=m;++i) { cin>>a>>b; if(a==b) continue; r=findit(H,a); s=findit(H,b); if(s->top==0) continue; lslink r1; r1=finaone(r); r1->link=s->link; r->top+=s->top; s->top=0; } for(int i=1;i<=n;++i) { lslink qwq=p->link; for(int j=1;j<=p->top;++j) { cout<<qwq->data<<" "; qwq=qwq->link; } cout<<endl; p=p->next; } return 0; }
|