zoukankan      html  css  js  c++  java
  • 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("=====================
    ");
     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 }
  • 相关阅读:
    Android Media Playback 中的MediaPlayer的用法及注意事项(二)
    Android Media Playback 中的MediaPlayer的用法及注意事项(一)
    34. Search for a Range
    33. Search in Rotated Sorted Array
    32. Longest Valid Parentheses
    31. Next Permutation下一个排列
    30. Substring with Concatenation of All Words找出串联所有词的子串
    29. Divide Two Integers
    28. Implement strStr()子串匹配
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/ohyee/p/5189795.html
Copyright © 2011-2022 走看看