#include #include #include #include using namespace std; void pickup(int p,int a,deque< deque > &pile,deque &locate); void pickup2(int p,int a,deque< deque > &pile,deque &locate); void printpile(deque< deque > &pile); int main(void){ int m,n; while(1){ cin >> m; if(m==0) break; deque< pair > inst;//命令 deque< deque > pile(m);//pile[i]:iを底とする山 deque locate(m);//locate[i]:iのある山 n = 0; while(1){ inst.push_back(make_pair(0,0)); cin >> inst[n].first >> inst[n].second; inst[n].first--; inst[n].second--; if(inst[n].first==-1) break; else n++; } for(int i=0;i 0 && pile[p][0]==a) continue; else pickup2(p,a,pile,locate); } //bが違う山 else if(locate[a]!=locate[b]){ p = locate[a]; q = locate[b]; pickup(p,a,pile,locate); pile[a].pop_back(); pile[q].push_back(a); locate[a] = q; } //bが同じ山 else if(locate[a]==locate[b]){ p = locate[a]; deque::iterator ia; deque::iterator ib; ia = find(pile[p].begin(),pile[p].end(),a); ib = find(pile[p].begin(),pile[p].end(),b); if(ia answer(m); for(int i=0;i > &pile,deque &locate){ int m,b; unsigned int i; //aが一番上 if(pile[p][(pile[p].size()-1)] == a){ pile[p].pop_back(); pile[a].push_back(a); locate[a] = a; } //そうでないとき else{ for(i=pile[p].size()-1;;i--){ if(pile[p][i]==a){ b = pile[p][i+1]; break; } } for(i=pile[p].size()-1;;i--){ if(pile[p][i]!=b){ int q = pile[p][i]; pile[p].pop_back(); pile[b].push_front(q); locate[q] = b; } else break; } pile[p].pop_back(); pile[b].push_front(b); locate[b] = b; pile[p].pop_back(); pile[a].push_back(a); locate[a] = a; } } //取り出すcubeの上のcubeはばらばらに床に下ろす void pickup2(int p,int a,deque< deque > &pile,deque &locate){ int m; unsigned int i; for(i=pile[p].size()-1;;i--){ if(pile[p][i]==a){ pile[p].pop_back(); pile[a].push_back(a); locate[a] = a; break; } else{ int q = pile[p][i]; pile[p].pop_back(); pile[q].push_back(q); locate[q] = q; } } } /* void printpile(deque< deque > &pile){ cout << "--------"<