2013年10月8日 星期二

UVA 101 The Blocks Problem

[LIST]
這題PRESENTATION ERROR 搞半天>"<

主要就是Implement、Simulation。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define QUIT 0
#define MOVE 1
#define PILE 2
#define ONTO 3
#define OVER 4
struct node
{
 int prev;
 int next;
};
int n;
node nods[100];
int clearat(int i)
{
 int prc;
 while(nods[i].next!=-1)
 {
  prc=nods[i].next;
  nods[i].next=-1;
  nods[prc].prev=prc-n;
  nods[prc-n].next=prc;
  i=prc;
 }
}
int getend(int i)
{
 while(nods[i].next!=-1)
  i=nods[i].next;
 return i;
}
int setto(int under,int a)
{
 nods[nods[a].prev].next=-1;
 nods[under].next=a;
 nods[a].prev=under;
}
void showline(int i)
{
 printf("%d:",i-1);
 while(nods[i].next!=-1)
 {
  i=nods[i].next;
  printf(" %d",i-n-1);
 }
 printf("\n");
}
int cmd(char ch[5])
{
 //DEBUG
 //if(ch[0]=='z')
 // return 99;
 switch(ch[1])
 {
  case 'u':
   return QUIT;
  case 'o':
   return MOVE;
  case 'i':
   return PILE;
  case 'n':
   return ONTO;
  case 'v':
   return OVER;
 }
 return QUIT;
}
int main()
{
 while(scanf("%d",&n)!=EOF)
 {
  for(int lx =1;lx<=n;lx++)
  {
   nods[lx].prev=-1;
   nods[lx].next=lx+n;
   nods[n+lx].prev=lx;
   nods[n+lx].next=-1;
  }
  char cmd1[5],cmd2[5];
  int a,b;
  while(1)
  {
   scanf("%s",cmd1);
   if(cmd(cmd1)==QUIT) break;
   /*if(cmd(cmd1)==99)
   {
    for(int lx=1;lx<=n;lx++)
     printf("qnd[%d]=%d\n",lx-1,getend(lx+n)-n-1);
    continue;
   }*/
   scanf("%d %s %d",&a,cmd2,&b);
   a+=1;b+=1;
   if((a==b)||((getend(a+n)==getend(b+n)))) continue;

   if((cmd(cmd1)==MOVE)&&(cmd(cmd2)==ONTO))
   {
    clearat(a+n);clearat(b+n);
    setto(b+n,a+n);
   }
   if((cmd(cmd1)==MOVE)&&(cmd(cmd2)==OVER))
   {
    clearat(a+n);
    setto(getend(b+n),a+n);
   }
   if((cmd(cmd1)==PILE)&&(cmd(cmd2)==ONTO))
   {
    clearat(b+n);
    setto(b+n,a+n);
   }
   if((cmd(cmd1)==PILE)&&(cmd(cmd2)==OVER))
    setto(getend(b+n),a+n);
   /*printf("====================\n");
   for(int lx=1;lx<=n;lx++)
    showline(lx);*/
  }
  for(int lx=1;lx<=n;lx++)
   showline(lx);
 }
 return 0;
}

沒有留言:

張貼留言