UVA 101 The Blocks Problem

来源:互联网 发布:剑灵热巴数据 编辑:程序博客网 时间:2024/06/17 05:21

    UVA 101 The Blocks Problem              题目链接

题目大意:

     给出数字n,表示有n个方块,每次按照操作步骤移动方块,根据不同的指令,执行不同的操作。

            1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面;

            2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;

            3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面;

            4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。

         比较有意思的是,当a和b在同一堆上时间,不需要进行操作,为此我wa了三次。


解题思路:

      根据四种情况进行模拟,本人运用的是结构体加数组的方法。题还不是太难,主要是读懂题意,比较绕,然后是要找到那个坑。


代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct stu{
 int a[50];
 int x;
}st; 
int main()
{
int i,j,k,m,n,x,y,x0,y0,x2,y2;
st s[50];
char s1[10],s2[10];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
s[i].x=0;
s[i].a[s[i].x++]=i;
}
while(scanf("%s",s1),strcmp(s1,"quit"))
{
scanf("%d%s%d",&x,s2,&y);
   for(i=0;i<n;i++)
{
for(j=0;j<s[i].x;j++)
{
if(x==s[i].a[j])
 x0=i,y0=j;
if(y==s[i].a[j])
   x2=i,y2=j;
 }
 }
if(x0==x2)
 continue;
if(!strcmp(s1,"move")&&!strcmp(s2,"onto"))
{
for(i=y0+1;i<s[x0].x;i++)
{
s[s[x0].a[i]].a[s[s[x0].a[i]].x++]=s[x0].a[i];
}
s[x0].x=y0;
for(i=y2+1;i<s[x2].x;i++)
{
s[s[x2].a[i]].a[s[s[x2].a[i]].x++]=s[x2].a[i];
}
s[x2].a[y2+1]=x;
s[x2].x=y2+2;
}
else if(!strcmp(s1,"move")&&!strcmp(s2,"over"))
{
for(i=y0+1;i<s[x0].x;i++)
{
s[s[x0].a[i]].a[s[s[x0].a[i]].x++]=s[x0].a[i];
}
s[x0].x=y0;
s[x2].a[s[x2].x++]=x;
}
else if(!strcmp(s1,"pile")&&!strcmp(s2,"onto"))
{
for(i=y2+1;i<s[x2].x;i++)
{
s[s[x2].a[i]].a[s[s[x2].a[i]].x++]=s[x2].a[i];
}
s[x2].x=y2+1;
for(i=y0;i<s[x0].x;i++)
{
s[x2].a[s[x2].x++]=s[x0].a[i];
 }
 s[x0].x=y0;
}
else if(!strcmp(s1,"pile")&&!strcmp(s2,"over"))
{
for(i=y0;i<s[x0].x;i++)
{
s[x2].a[s[x2].x++]=s[x0].a[i];
 }
s[x0].x=y0; 
}
}
    for(i=0;i<n;i++)
     {
    printf("%d:",i);
    for(j=0;j<s[i].x;j++)
    {
    printf(" %d",s[i].a[j]);
}
printf("\n");
 }
}
return 0;
}

    

    

原创粉丝点击