POJ-1208-The Blocks Problem

378 篇文章 0 订阅

这个题属于一个模拟题,就是模仿一个积木游戏,具体翻译可以参考:

http://www.cnblogs.com/devymex/archive/2010/08/04/1792128.html

其实按照题目意思进行相应的模拟就可以了,比较简单吧。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 30
using namespace std;
int n,pos[MAX],stack[MAX][MAX],len[MAX];
void DealMove(int index)
{
    int w=pos[index];
    for(int i=len[w]-1;stack[w][i]!=index;i--)
    {
	int ita=stack[w][i];
	pos[ita]=ita;
	stack[ita][len[ita]++]=ita;
	len[w]--;
    }
}
void Show()
{
    for(int i=0;i<n;i++)
    {
	printf("%d:",i);
	for(int j=0;j<len[i];j++)
	    printf(" %d",stack[i][j]);
	printf("\n");
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
	for(int i=0;i<n;i++)
	{
	    len[i]=1;
	    pos[i]=i;
	    stack[i][0]=i;
	}
	char op[10];
	while(scanf("%s",op)&&op[0]!='q')
	{
	    int a,b;
	    char s[10];
	    scanf("%d%s%d",&a,&s,&b);
	    if(a==b&&pos[a]==pos[b])
		continue;
	    if(op[0]=='m')
	    {
		if(s[1]=='n')
		{
		    DealMove(a);
		    DealMove(b);
		    stack[pos[b]][len[pos[b]]++]=a;
		    len[pos[a]]--;
		    pos[a]=pos[b];
		}
		else
		{
		    DealMove(a);
		    stack[pos[b]][len[pos[b]]++]=a;
		    len[pos[a]]--;
		    pos[a]=pos[b];
		}
	    }
	    else
	    {
		if(s[1]=='n')
		{
		    DealMove(b);
		    int t=-1;
		    for(int i=0;i<len[pos[a]];i++)
			if(stack[pos[a]][i]==a)
			{
			    t=i;
			    break;
			}
		    int lena=len[pos[a]],last=pos[a];
		    for(int i=t;i<lena;i++)
		    {
			stack[pos[b]][len[pos[b]]++]=stack[last][i];
			pos[stack[last][i]]=pos[b];
			len[last]--;
		    }
		}
		else
		{
		    int t=-1,lena;
		    for(int i=0;i<len[pos[a]];i++)
			if(stack[pos[a]][i]==a)
			{
			    t=i;
			    break;
			}
		    lena=len[pos[a]];
		    int last=pos[a];
		    for(int i=t;i<lena;i++)
		    {
			stack[pos[b]][len[pos[b]]++]=stack[last][i];
			pos[stack[last][i]]=pos[b];
			len[last]--;
		    }
		}
	    }
	    //Show();
	}
	Show();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值