题意比较容易理解
《入门经典》上用的是向量,不过觉得用链表更快点~
于是,就在链表这个大坑中爬不出来了……
要注意对两种情况的排除,一个是a==b,另一个就是a、b在同一堆
在链表中,要注意什么时候链表到尽头,到底用 temp!=NULL 还是用 temp->next!=NULL 做循环判断的条件
另外,当链表的节点进行移动操作的时候,要注意移动 temp->next->last 和 temp->last->next (其中还要判断 temp->last 和 temp->next 存在与否)
(要在这里被坑多少次才能记住╮(╯-╰)╭)
保证这些地方没问题,剩下就对着要求操作就好
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 using namespace std; 5 6 struct blocks{ 7 int n; 8 blocks *up; 9 blocks *down; 10 }; 11 12 int n; 13 blocks *b[30],*p[30]; 14 15 void back(int n){ 16 if(b[n]->up!=NULL) 17 back(b[n]->up->n); 18 if(b[n]->down!=NULL) 19 b[n]->down->up=NULL; 20 b[n]->up=b[n]->down=NULL; 21 p[n]=b[n]; 22 } 23 24 void pr(){ 25 printf("===================== "); 26 for(int i=0;i<n;i++){ 27 printf("%d:",i); 28 blocks *temp=p[i]; 29 while(temp!=NULL){ 30 printf(" %d",temp->n); 31 temp=temp->up; 32 } 33 printf(" "); 34 } 35 36 printf(" "); 37 for(int i=0;i<n;i++){ 38 printf("%d: %d %d %d ",i,b[i]->down==NULL?-1:b[i]->down->n,i,b[i]->up==NULL?-1:b[i]->up->n); 39 } 40 41 printf("===================== "); 42 return; 43 } 44 45 int main(){ 46 //freopen("in.txt","r",stdin); 47 //======init====== 48 for(int i=0;i<30;i++) 49 p[i]=b[i]=new blocks{i,NULL,NULL}; 50 //================ 51 52 scanf("%d",&n); 53 54 char com1[5],com2[5]; 55 int A,B; 56 57 while(1){ 58 scanf("%s %d %s %d",com1,&A,com2,&B); 59 if(!strcmp(com1,"quit"))break; 60 61 //pr(); 62 63 //printf("%s %d %s %d ",com1,A,com2,B); 64 if(A==B)continue; 65 bool can=true; 66 blocks *t=b[A]; 67 while(t!=NULL){ 68 t=t->up; 69 if(t==b[B]) 70 can=false; 71 } 72 t=b[A]; 73 while(t!=NULL){ 74 t=t->down; 75 if(t==b[B]) 76 can=false; 77 } 78 if(!can)continue; 79 80 if(!(strcmp(com1,"move")||strcmp(com2,"onto"))){ 81 back(A); 82 if(b[B]->up!=NULL) 83 back(b[B]->up->n); 84 b[B]->up=b[A]; 85 b[A]->down=b[B]; 86 if(p[A]==b[A]) 87 p[A]=NULL; 88 } 89 if(!(strcmp(com1,"move")||strcmp(com2,"over"))){ 90 back(A); 91 blocks *temp=b[B]; 92 while(temp->up!=NULL) 93 temp=temp->up; 94 temp->up=b[A]; 95 b[A]->down=temp; 96 if(p[A]==b[A]) 97 p[A]=NULL; 98 } 99 if(!(strcmp(com1,"pile")||strcmp(com2,"onto"))){ 100 if(b[B]->up!=NULL) 101 back(b[B]->up->n); 102 b[B]->up=b[A]; 103 if(b[A]->down!=NULL) 104 b[A]->down->up=NULL; 105 b[A]->down=b[B]; 106 if(p[A]==b[A]) 107 p[A]=NULL; 108 } 109 if(!(strcmp(com1,"pile")||strcmp(com2,"over"))){ 110 blocks *temp=b[B]; 111 while(temp->up!=NULL) 112 temp=temp->up; 113 temp->up=b[A]; 114 if(b[A]->down!=NULL) 115 b[A]->down->up=NULL; 116 b[A]->down=temp; 117 if(p[A]==b[A]) 118 p[A]=NULL; 119 } 120 } 121 122 for(int i=0;i<n;i++){ 123 printf("%d:",i); 124 blocks *temp=p[i]; 125 while(temp!=NULL){ 126 printf(" %d",temp->n); 127 temp=temp->up; 128 } 129 printf(" "); 130 } 131 return 0; 132 }