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 }
  • 相关阅读:
    TP5 查询mysql数据库时的find_in_set用法
    使用paginate方法分页无法判断获取的数据是否为空
    苹果电脑Mac系统如何安装Adobe Flash Player
    JavaScript Timing 事件及两种时钟写法
    JavaScript 弹出框
    JavaScript 表单验证
    fastadmin CMS等系列插件安装不成功的问题
    fastadmin中js是如何调用的
    fastadmin安装定时插件报错 ZipArchive::extractTo(): Permission denied
    今天科普一下 苹果开发者账号中:个人、公司、企业账号的区别
  • 原文地址:https://www.cnblogs.com/ohyee/p/5189795.html
Copyright © 2011-2022 走看看