本来是准备复习使用STL的,结果顺带练习了下模拟。
模拟:这题只要理解4种操作即可,(开始我理解错了2种操作,耽误了时间啊)
STL:使用了vector + iterator
vector<int>::iterator iter;
iter=pile[u].begin();
iter=pile[index].erase(iter);
pile[pos[q]].push_back(p);
pile[pos[p]].pop_back();
pile[pos[q]].push_back(*iter);
y=pile[pos[p]].size();
看别人的博客是知道了 list 中的 splice函数,要学习下哈
#include<stdio.h>
#include<vector>
#include<string.h>
#include <iostream>
#define N 26
using namespace std;
int pos[N];
vector<int> pile[N];
void returnback(int t,int x){
int i,j,k;
for(i=pile[t].size()-1;i>0;i--){
if(pile[t][i]==x)
break;
k=pile[t][i];
pile[k].push_back(k);
pos[k]=k;
pile[t].pop_back();
}
}
void showall(int n){
int i,j;
for(i=0;i<n;i++){
printf("%d:",i);
for(j=0;j<pile[i].size();j++)
printf(" %d",pile[i][j]);
printf("\n");
}
}
int main(){
// freopen("poj1208.in","r",stdin);
int n,i,j,k,p,q;
char s1[10],s2[10];
scanf("%d",&n);
for(i=0;i<n;i++){
pos[i]=i;
pile[i].push_back(i);
}
for(i=0;i<n;i++){
scanf("%s",s1);
if(s1[0]=='q')
break;
scanf("%d %s %d",&p,s2,&q);
if(p==q||pos[p]==pos[q])
continue;
if(!strncmp(s1,"move",4)&&!strncmp(s2,"onto",4)){
returnback(pos[p],p); //只传参 p 试试
returnback(pos[q],q);
pile[pos[q]].push_back(p);
pile[pos[p]].pop_back();
pos[p]=pos[q];
}
else if(!strncmp(s1,"move",4)&&!strncmp(s2,"over",4)){
returnback(pos[p],p);
pile[pos[q]].push_back(p);
pile[pos[p]].pop_back();
pos[p]=pos[q];
}
else if(!strncmp(s1,"pile",4)&&!strncmp(s2,"onto",4)){
returnback(pos[q],q);
int y=pile[pos[p]].size(),x;
int u=pos[p],index=pos[p];
vector<int>::iterator iter;
for(x=0,iter=pile[u].begin();x<y;x++,iter++)
if(pile[u][x]==p)
break;
//x--;
for(;x<y;x++){
pile[pos[q]].push_back(*iter);
pos[pile[u][x]]=pos[q];
iter=pile[index].erase(iter);
}
}
else if(!strncmp(s1,"pile",4)&&!strncmp(s2,"over",4)){
int y=pile[pos[p]].size(),x;
int u=pos[p],index=pos[p];
vector<int>::iterator iter;
for(x=0,iter=pile[u].begin();x<y;x++,iter++)
if(pile[u][x]==p)
break;
//x--;
for(;x<y;x++){
pile[pos[q]].push_back(*iter);
pos[pile[u][x]]=pos[q];
iter=pile[index].erase(iter);
}
}
}
showall(n);
}