Uva 101.The Blocks Problem

题意比较容易理解

《入门经典》上用的是向量,不过觉得用链表更快点~

于是,就在链表这个大坑中爬不出来了……

要注意对两种情况的排除,一个是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("=====================\n");
 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("\n");
 34     }
 35 
 36     printf("\n");
 37     for(int i=0;i<n;i++){
 38         printf("%d: %d %d %d\n",i,b[i]->down==NULL?-1:b[i]->down->n,i,b[i]->up==NULL?-1:b[i]->up->n);
 39     }
 40     
 41     printf("=====================\n");
 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\n",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("\n");
130     }
131     return 0;
132 }

 

posted @ 2016-02-15 00:37  OhYee  阅读(272)  评论(0编辑  收藏  举报