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; }