UVA 101 The Blocks Problem

纯模拟题 用vector型的vector模拟,我用了一个p数组适当优化了效率,用p数组记录对应编号牌的位置;
题目大意:
在早期人工智慧的領域中常常會用到機器人,在這個問題中有一支機器手臂接受指令來搬動積木,而你的任務就是輸出最後積木的情形。
一開始在一平坦的桌面上有n塊積木(編號從0到n-1)0號積木放在0號位置上,1號積木放在1號位置上,依此類推。
機器手臂有以下幾種合法搬積木的方式(a和b是積木的編號):
move a onto b
在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝)
move a over b
在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動)
pile a onto b
將a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位
pile a over b
將a本身和其上的積木一起搬到到b所在的那堆積木之上
quit
其实各个移动方式之间都有类似之处,所以只要写出其中一个,下面的就简单一些了。
move a onto b:把b和a上面的全部积木移掉,然后再把a放到b上面,我采用分别搜索p[a],p[b]位置,在p[a]中搜索a,一旦搜索到将处于a上方的积木对应的p进行更新,然后再统一清空p[a]位置的且在a之上的所有积木(包括 a),位置p[b]中搜索b,类似的方法更新,然后删除,最后将p[a]更新为p[b],将a push_back入b;
move a over b:这个只要在前者的基础上,去掉对p[b]位置的更新就好了。
pile a onto b:这个要先把p[b]位置积木更新(移除),然后再将a- p[a]的最高点的积木都push_back入b,然后统一删除。
pile a over b:这个只要在前者的基础上再减少对p[b]的移除更新即可。


#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
using namespace std;
const int MAXN=30;
int p[MAXN];
int main()
{
    int i, j, n, a, b, p1, p2;
    char cmd[10], kd[10];
    vector<vector<int> > s;
    vector<int> t;
    while(scanf("%d",&n)!=EOF)
    {
        s.clear();
        for(i=0;i<n;i++)
        {
            t.push_back(i);
            s.push_back(t);
            t.clear();
            p[i]=i;
        }
        while(scanf("%s",cmd))
        {
            if(cmd[0]=='q') break;
            scanf("%d%s%d",&a,kd,&b);
            if(a==b||p[a]==p[b]) continue;
            if(cmd[0]=='m')
            {
                if(kd[1]=='n')
                {
                    p1=p[a], p2=p[b];
                    for(i=0;i<s[p1].size();i++)
                    {
                        if(s[p1][i]==a)
                        {
                            for(j=i+1;j<s[p1].size();j++)
                            {
                                p[s[p1][j]]=s[p1][j];
                                s[s[p1][j]].push_back(s[p1][j]);
                            }
                            s[p1].erase(s[p1].begin()+i,s[p1].end());
                            break;
                        }
                    }
                    for(i=0;i<s[p2].size();i++)
                    {
                        if(s[p2][i]==b)
                        {
                            for(j=i+1;j<s[p2].size();j++)
                            {
                                p[s[p2][j]]=s[p2][j];
                                s[s[p2][j]].push_back(s[p2][j]);
                            }
                            s[p2].erase(s[p2].begin()+i+1,s[p2].end());
                            break;
                        }
                    }
                    s[p2].push_back(a);
                    p[a]=p2;
                }
                else
                {
                    p1=p[a], p2=p[b];
                    for(i=0;i<s[p1].size();i++)
                    {
                        if(s[p1][i]==a)
                        {
                            for(j=i+1;j<s[p1].size();j++)
                            {
                                p[s[p1][j]]=s[p1][j];
                                s[s[p1][j]].push_back(s[p1][j]);
                            }
                            s[p1].erase(s[p1].begin()+i,s[p1].end());
                            break;
                        }
                    }
                    s[p2].push_back(a);
                    p[a]=p2;
                }
            }
            else if(cmd[0]=='p')
            {
                if(kd[1]=='n')
                {
                    p1=p[a], p2=p[b];
                    for(i=0;i<s[p2].size();i++)
                    {
                        if(s[p2][i]==b)
                        {
                            for(j=i+1;j<s[p2].size();j++)
                            {
                                p[s[p2][j]]=s[p2][j];
                                s[s[p2][j]].push_back(s[p2][j]);
                            }
                            s[p2].erase(s[p2].begin()+i+1,s[p2].end());
                            break;
                        }
                    }
                    for(i=0;i<s[p1].size();i++)
                    {
                        if(s[p1][i]==a)
                        {
                            for(j=i;j<s[p1].size();j++)
                            {
                                p[s[p1][j]]=p2;
                                s[p2].push_back(s[p1][j]);
                            }
                            s[p1].erase(s[p1].begin()+i,s[p1].end());
                            break;
                        }
                    }
                }
                else
                {
                    p1=p[a], p2=p[b];
                    for(i=0;i<s[p1].size();i++)
                    {
                        if(s[p1][i]==a)
                        {
                            for(j=i;j<s[p1].size();j++)
                            {
                                p[s[p1][j]]=p2;
                                s[p2].push_back(s[p1][j]);
                            }
                            s[p1].erase(s[p1].begin()+i,s[p1].end());
                            break;
                        }
                    }
                }
            }
        }
        for(i=0;i<n;i++)
        {
            printf("%d:",i);
            for(j=0;j<s[i].size();j++)
            {
                printf(" %d",s[i][j]);
            }
            puts("");
        }
    }
    return 0;
}




posted @ 2013-04-28 22:59  Ink_syk  阅读(93)  评论(0编辑  收藏  举报