现在的位置: 首页 > 综合 > 正文

POJ 1208 The Blocks Problem 简单栈模拟

2018年04月25日 ⁄ 综合 ⁄ 共 1355字 ⁄ 字号 评论关闭

题意:有n(0<n<25)快block,有5种操作:

move a onto b  在将a搬到b上之前,先把a和b上的积木放回原來的位置

move a over b在将a搬到b所在的那堆积木上前,先把a上的积木放回原來的位罝

pile a onto b 将包括a本身和上方的积木一起放到b上,在放之前b上方的积木放回原来的位置

pile a over b 将包括a本身和上放的积木一起搬到到b所在的那堆上 

quit结束命令,前四个动作中若ab在同一堆中,则不做改变。


Sure原创,转载请注明出处。

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn = 30;
int stack[maxn][maxn],num[maxn],belong[maxn];
char cao[maxn],wei[maxn];
int n;

void break_up(int pos,int val)
{
    while(stack[pos][num[pos]-1] != val)
    {
        int st = stack[pos][--num[pos]];
        stack[st][num[st]++] = st;
        belong[st] = st;
    }
    return;
}

void put(int fr,int val,int to)
{
    int p = 0;
    while(stack[fr][p] != val) p++;
    int bj = p;
    while(p < num[fr])
    {
        stack[to][num[to]++] = stack[fr][p];
        belong[stack[fr][p++]] = to;
    }
    num[fr] = bj;
    return;
}

void solve()
{
    for(int i=0;i<n;i++)
    {
        num[i] = 1;
        belong[i] = i;
        stack[i][0] = i;
    }
    int u,v;
    while(scanf("%s",cao))
    {
        if(strcmp(cao , "quit") == 0) break;
        scanf("%d %s %d",&u,wei,&v);
        int x = belong[u];
        int y = belong[v];
        if(x == y) continue;
        if(strcmp(cao , "move") == 0)
        {
            if(strcmp(wei , "onto") == 0)
            {
                break_up(x , u);
                break_up(y , v);
                stack[y][num[y]++] = stack[x][--num[x]];
                belong[u] = y;
            }
            else
            {
                break_up(x , u);
                stack[y][num[y]++] = stack[x][--num[x]];
                belong[u] = y;
            }
        }
        else
        {
            if(strcmp(wei , "onto") == 0)
            {
                break_up(y , v);
                put(x , u , y);
            }
            else
            {
                put(x , u , y);
            }
        }
    }
    return;
}

void out()
{
    for(int i=0;i<n;i++)
    {
        printf("%d:",i);
        for(int j=0;j<num[i];j++)
        {
            printf(" %d",stack[i][j]);
        }
        puts("");
    }
    return;
}

int main()
{
    while(~scanf("%d",&n))
    {
        solve();
        out();
    }
    return 0;
}

抱歉!评论已关闭.