UVa OJ 101

1、本题要用到队列,还复习了一下fgets和sscanf函数。虽然觉得难但是一次AC~

2、注意把移动操作单独写一个函数会大大简化程序。

3、注意pile操作时队列长度会变,所以应用一个变量temp3保存初始队列的长度。总之,要具体情况具体分析,还要仔细。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;
int p[30][30]={0},r[30]={0},c[30]={0},len[30]={0},n,i,a,b,j,num,temp1,temp2,temp3;
char s[30]="",cmd1[6]="",cmd2[6]="";
void mov(int num,int a,int b)
{
     p[b][len[b]+1]=num;
     len[b]++;
     len[a]--;
     r[num]=b;
     c[num]=len[b];
}
int main(void)
{
    scanf("%d\n",&n);
    for(i=0;i<n;i++)
    {
       p[i][1]=i;
       len[i]++;
       r[i]=i;
       c[i]=len[i];
    }
    while(fgets(s,20,stdin)!=NULL)
    {
        if(strcmp(s,"quit\n")==0) break;
        sscanf(s,"%[^ ]%d %[^ ]%d",cmd1,&a,cmd2,&b);
        if(strcmp(cmd1,"move")==0&&r[a]!=r[b]&&a!=b)
        {
            if(strcmp(cmd2,"onto")==0)
            {
                if(len[r[a]]>c[a])
                     for(j=len[r[a]];j>=c[a]+1;j--)
                     {
                          num=p[r[a]][j];
                          mov(num,r[a],num);
                     }
                if(len[r[b]]>c[b])
                     for(j=len[r[b]];j>=c[b]+1;j--)
                     {
                          num=p[r[b]][j];
                          mov(num,r[b],num);
                     }
                mov(a,r[a],r[b]);
            }
            if(strcmp(cmd2,"over")==0)
            {
                if(len[r[a]]>c[a])
                     for(j=len[r[a]];j>=c[a]+1;j--)
                     {
                          num=p[r[a]][j];
                          mov(num,r[a],num);
                     }
                mov(a,r[a],r[b]);
            }
        }
        if(strcmp(cmd1,"pile")==0&&r[a]!=r[b]&&a!=b)
        {
            if(strcmp(cmd2,"onto")==0)
            {
                temp1=r[a];
                temp2=c[a];
                temp3=len[temp1];
                if(len[r[b]]>c[b])
                     for(j=len[r[b]];j>=c[b]+1;j--)
                     {
                          num=p[r[b]][j];
                          mov(num,r[b],num);
                     }
                if(temp3>=temp2)
                     for(j=temp2;j<=temp3;j++)
                     {
                          num=p[temp1][j];
                          mov(num,temp1,r[b]);
                     }
            }
            if(strcmp(cmd2,"over")==0)
            {
                temp1=r[a];
                temp2=c[a];
                temp3=len[temp1];
                 if(temp3>=temp2)
                     for(j=temp2;j<=temp3;j++)
                     {
                          num=p[temp1][j];
                          mov(num,temp1,r[b]);
                     }
            }
        }
    }
    for(i=0;i<n;i++)
    {
       printf("%d:",i);
       if(len[i]>0)
          for(j=1;j<=len[i];j++)
             printf(" %d",p[i][j]);
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值