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;
}

 

 

原文地址:https://www.cnblogs.com/scau20110726/p/2712584.html