• uva 101 The Blocks Problem


      1. 1.     move a onto b
        在將a搬到b上之前,先將ab上的積木放回原來的位置(例如:1就放回1的最開始位罝)
        2. move a over b
        在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動)
        3. pile a onto b
        a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位
        4. pile a over b
        a本身和其上的積木一起搬到到b所在的那堆積木之上

     

    //用链表实现,没有任何算法可言,完全就是模拟,感觉用数组来做代码能更短

    //由于用链表来做的原因,涉及到指针所以很多细节问题,实际上调试很久,指针的东西太久没写都忘记

    //了,以后要适当复习

    //时间0.012

     

     

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define LEN1 sizeof(struct list)
    #define LEN2 sizeof(struct node)
    #define MAX 30  //最多有25个积木
    struct list
    {
        int num;
        struct list *prior,*next;
        struct node *head;
    }*L;
    struct node
    {
        int num;
        struct node *next;
    };
    int n,a,b,ans[30];  //ans是在输出答案时保存答案的
    
    void print_link()
    {
        struct list *p=L;  struct node *q;
        while(p)
        {
            printf("%d\n",p->num); q=p->head;
            while(q) {printf("%3d",q->num); q=q->next;} printf("\n");
            p=p->next;
        }
    }
    
    void create_link()
    {
        struct list *l1,*l2;  int i;
        L=l1=(struct list*)malloc(LEN1); L->prior=L->next=NULL; L->num=0;
        L->head=(struct node*)malloc(LEN2);  L->head->next=NULL;  L->head->num=0;
        for(i=1; i<n; i++)
        {
            l2=(struct list*)malloc(LEN1); l2->prior=l1; l1->next=l2; l2->next=NULL; l2->num=i; l1=l2;
            l2->head=(struct node*)malloc(LEN2); l2->head->next=NULL; l2->head->num=i;
        }
    }
    
    void move(struct list *s)
    {
        struct node *p=s->head;  struct list *l;
        while(p && p->num!=a && p->num!=b)
        {
            p=s->head; l=L; 
            while(l->num!=p->num) 
                l=l->next;
            s->head=p->next; 
            p->next=l->head; 
            l->head=p; 
            p=s->head;
        }
    }
    
    //在收到一条指令后要先判断这条指令是否合法,非法的指令是指a和b在同一堆积木中
    void command_1()  //move a onto b 在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝)
    {
        struct list *l1=L,*l2; struct node *h1;  int count;
        while(l1)
        {
            h1=l1->head;  count=0;
            while(h1)  
            { if(h1->num==a || h1->num==b)  count++; h1=h1->next; }
            if(count==1)  { move(l1); /*printf("move is ok ");*/ }
            else if(count==2) return ;
            l1=l1->next;
        }
    //    printf("\nmove is end\n");
        l1=L; 
        while(l1) 
        {
            if((l1->head) && (l1->head->num)==a)  break;
            l1=l1->next;
        }
        l2=L; 
        while(l2) 
        {
            if((l2->head) && (l2->head->num)==b)  break;
            l2=l2->next;
        }
        h1=l1->head; 
        l1->head=h1->next;
        h1->next=l2->head; 
        l2->head=h1;
    //    printf("command_1 is end\n");
    }
    void command_2() //move a over b 在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動)
    {
        struct list *l1=L,*l2; struct node *h1;  int flag,count;
        while(l1)
        {
            h1=l1->head;  count=flag=0;
            while(h1)  
            { 
                if(h1->num==a)  {flag=1;count++;}
                if(h1->num==b)  count++;
                h1=h1->next; 
            }
            if(count==1 && flag)  { move(l1); /*printf("move is ok ");*/ break;}
            else if(count==2) return ;
            l1=l1->next;
        }
    //    printf("\nmove is end\n");
    //    l1=L; while(l1->head->num!=a) l1=l1->next;
        l2=L;
        while(l2)
        {
            flag=0; h1=l2->head; while(h1)  {if(h1->num==b) {flag=1; break;} h1=h1->next;}
            if(flag) break;
            l2=l2->next;
        }
        h1=l1->head; 
        l1->head=h1->next;
        h1->next=l2->head; 
        l2->head=h1;
    //    printf("command_2 is end\n");
    }
    void command_3()  //pile a onto b 將a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位
    {
        struct list *l1,*l2; struct node *h1,*h2;  int flag,count;
        l1=L;
        while(l1)
        {
            h1=l1->head;  count=flag=0;
            while(h1)  
            { 
                if(h1->num==b)  {flag=1;count++;}
                if(h1->num==a)  count++;
                h1=h1->next; 
            }
            if(count==1 && flag)  { move(l1); /*printf("move is ok ");*/ break;}
            else if(count==2) return ;
            l1=l1->next;
        }
    //    printf("\nmove is over\n");
    //    l1=L; while(l1->head->num!=a) l1=l1->next;
        l2=L;
        while(l2)
        {
            flag=0; h1=l2->head; 
            while(h1)  {    if(h1->num==a) {flag=1; break;}   h1=h1->next;   }
            if(flag) break;
            l2=l2->next;
        }
        h2=h1->next; 
        h1->next=l1->head; 
        l1->head=l2->head; 
        l2->head=h2;
    //    printf("command_3 is end\n");
    }
    void command_4() //pile a over b 將a本身和其上的積木一起搬到到b所在的那堆積木之上
    {
        struct list *l1,*l2; struct node *h1,*h2,*temp1,*temp2;  int flag;
        l1=L;
        while(l1)
        {
            flag=0; h1=l1->head; while(h1) {if(h1->num==a) {flag=1; break;} h1=h1->next;}
            if(flag) break;
            l1=l1->next;
        }
        l2=L;
        while(l2)
        {
            flag=0; h2=l2->head; while(h2) {if(h2->num==b) {flag=1; break;} h2=h2->next;}
            if(flag) break;
            l2=l2->next;
        }
        if(l1==l2)  return ;
        temp1=h1->next; 
        h1->next=l2->head;  
        l2->head=l1->head;  
        l1->head=temp1;
    //    printf("command_4 is end\n");
    }
    void print_answer()
    {
        struct list *p=L;  struct node *q;  int i;
        while(p)
        {
            printf("%d:",p->num); q=p->head; i=-1;
            while(q) { ans[++i]=q->num; q=q->next; }
            while(i>=0) printf(" %d",ans[i--]);  printf("\n");
            p=p->next;
        }
    }
    int main()
    {
        int i;  char s1[20],s2[20];
        scanf("%d",&n); create_link();  //print_link();
        while(1)
        {
            scanf("%s",s1);  if(!strcmp(s1,"quit"))  break;
            scanf("%d%s%d",&a,s2,&b);  //printf("%s %d %s %d\n",s1,a,s2,b);
            if(a==b) continue;
            if     ( !strcmp(s1,"move") && !strcmp(s2,"onto") )  
            { /*printf("command_1\n");*/command_1(); }
            else if( !strcmp(s1,"move") && !strcmp(s2,"over") )  
            { /*printf("command_2\n");*/command_2(); }
            else if( !strcmp(s1,"pile") && !strcmp(s2,"onto") )  
            { /*printf("command_3\n");*/command_3(); }
            else if( !strcmp(s1,"pile") && !strcmp(s2,"over") )  
            { /*printf("command_4\n");*/command_4(); }
    //        print_answer();
        }
        print_answer();
        return 0;
    }

     

     

  • 相关阅读:
    Android studio 快捷键记录
    Android开发 判断目标Fragment是否在前台
    Android开发 build.gradle的使用记录
    Android开发 在Application用于初始化的工具类
    Android开发 因为模块化导致findViewById返回为空null
    Android开发 本地广播
    Android开发 报错: xxx does not have a NavController set on xxx
    Android开发 GridLayout网格布局
    Android开发 Fragment启动Activity在使用onActivityResult的一些问题
    Html 创建自定义标签并且被jQuery获取到
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2712584.html
Copyright © 2020-2023  润新知