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;
}
浙公网安备 33010602011771号