1733 盒子工厂

来源:互联网 发布:创业软件办公平台 编辑:程序博客网 时间:2024/05/19 22:52
 
描述

淘宝的生意越来越火,以至于包装用的盒子都供不应求。现在一个盒子工厂的老板需要你编写一个控制程序,来帮助他们制造盒子。

这个程序所需要实现的功能很简单,读取一条指令,然后指挥机械臂去执行就可以了。但是,如果指令不合法,应该把这条命令忽略掉。

初始时有 n 个盒子(编号0 ~ n-1)顺次排列在一条流水线上。

有效命令包括:

move a onto b
a 和 b 均为盒子编号,此命令作用是将 a 和 b 两个盒子之上的盒子全部放回初始位置以后,将 a 放于盒子 b 上;

move a over b
a 和 b 均为盒子编号,此命令作用是在把所有在 a 盒子之上的盒子放回初始位置后,把 a 放于含有 b 盒子的堆上;

pile a onto b
a 和 b 均为盒子编号,此命令作用是先把放在 b 盒子上面的所有盒子放回初始位置,再把 a 及 a 盒子上面所有盒子移到 b 盒子所在堆上,移动时保持 a 及 a 以上盒子的堆放次序;

pile a over b
a 和 b 均为盒子编号,此命令作用是把 a 及 a 上面的所有盒子放在含有 b 盒子的堆上面;

quit
退出程序。

任何命令中,假设出现 a = b 或者 a 和 b 出现在同一堆盒子中,那么我们认为这条命令不合法。所以你的控制程序需要知道任何时候流水线上的盒子堆叠状况。

输入

输入包含多组数据。
对于每组数据,第一行为一个整数 n (1 <= n <= 25),为盒子的个数。
接下来为命令序列,每行一条有效命令,格式如上文描述,你的程序需要顺序执行这些命令。命令序列以一条 quit 命令结束。
当 n = 0 时输入结束。

输出

对于每组数据,输出 n 行,为控制程序退出后流水线上的盒子堆叠状况。第 i+1 行为编号为 i 的盒子的初始位置所堆叠的盒子状况:以 i 开头,后接":",然后空格,然后最底层盒子编号,再空格,再是从下数第二个盒子的编号......

 

模拟题

#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;int box[ 27 ][ 2 ];int main(){int n;cin >> n;string s;int k1, k2;string s2;while ( n!= 0 ){   vector<int> v[ 27 ];   for ( int i = 0; i < n; i++ )   {    v[ i ].push_back( i );    box[ i ][ 0 ] = i;    box[ i ][ 1 ] = v[ i ].size() - 1;   }     cin >> s;   while ( s != "quit")   {    cin >> k1 >> s2 >> k2;    if ( s == "move" && s2 == "onto" )    {     if ( box[ k1 ][ 0 ] != box[ k2 ][ 0 ] )     {     vector<int>::iterator it;     it =v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ];          it++;     while ( it != v[ box[ k1 ][ 0 ] ].end() )     {      v[ *it ].push_back( *it );      box[ *it ][ 0 ] = *it;      box[ *it ][ 1 ] = v[ *it ].size() - 1;      it++;     }         it--;     while ( it != v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ] )     {      v[ box[ k1 ][ 0 ] ].pop_back();      it--;     }        //vector<int>::iterator it;     it = v[ box[ k2 ][ 0 ] ].begin() + box[ k2 ][ 1 ];     it++;     while ( it != v[ box[ k2 ][ 0 ] ].end() )     {      v[ *it ].push_back( *it );      box[ *it ][ 0 ] = *it;      box[ *it ][ 1 ] = v[ *it ].size() - 1;      it++;     }         it--;     while ( it != v[ box[ k2 ][ 0 ] ].begin() + box[ k2 ][ 1 ] )     {      v[ box[ k2 ][ 0 ] ].pop_back();      it--;     }         v[ box[ k1 ][ 0 ] ].pop_back();     v[ box[ k2 ][ 0 ] ].push_back( k1 );     box[ k1 ][ 0 ] = box[ k2 ][ 0 ];     box[ k1 ][ 1 ] = v[ box[ k2 ][ 0 ] ].size() - 1;     }    }    else if ( s == "move" && s2 == "over" )    {     if ( box[ k1 ][ 0 ] != box[ k2 ][ 0 ] )     {     vector<int>::iterator it;     it = v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ] ;     it++;     while ( it != v[ box[ k1 ][ 0 ] ].end() )     {      v[ *it ].push_back( *it );      box[ *it ][ 0 ] = *it;      box[ *it ][ 1 ] = v[ *it ].size() - 1;      it++;     }         it--;     while ( it != v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ] )     {      v[ box[ k1 ][ 0 ] ].pop_back();      it--;     }     v[ box[ k1 ][ 0 ] ].pop_back();     v[ box[ k2 ][ 0 ] ].push_back( k1 );     box[ k1 ][ 0 ] = box[ k2 ][ 0 ];     box[ k1 ][ 1 ] = v[ box[ k2 ][ 0 ] ].size() - 1;     }    }    else if ( s == "pile" && s2 == "onto" )    {     if ( box[ k1 ][ 0 ] != box[ k2 ][ 0 ] )     {     vector<int>::iterator it,it1,it2;     it = v[ box[ k2 ][ 0 ] ].begin() + box[ k2 ][ 1 ] ;     it++;     while ( it != v[ box[ k2 ][ 0 ] ].end() )     {      v[ *it ].push_back( *it );      box[ *it ][ 0 ] = *it;      box[ *it ][ 1 ] = v[ *it ].size() - 1;      it++;     }         it--;     while ( it != v[ box[ k2 ][ 0 ] ].begin() + box[ k2 ][ 1 ] )     {      v[ box[ k2 ][ 0 ] ].pop_back();      it--;     }         it = v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ];     it1 = v[ box[ k1 ][ 0 ] ].begin();     it2 = v[ box[ k1 ][ 0 ] ].end();     int l0 = box[ k1 ][ 0 ];     int l1 = box[ k1 ][ 1 ];     while ( it != it2 )     {      v[ box[k2 ][ 0 ] ].push_back( *it );      box[ *it ][ 0 ] = box[k2 ][ 0 ];      box[ *it ][ 1 ] = v[box[k2 ][ 0 ] ].size() - 1;      it++;     }         it--;     while ( it != it1 + l1 )     {      it--;      v[l0 ].pop_back();          }     v[ l0 ].pop_back();     }    }    //    else if ( s == "pile" && s2 == "over" )    {     if ( box[ k2 ][ 0 ] != box[ k1 ][ 0 ] )     {      vector<int>::iterator it,it1, it2;      it = v[ box[ k1 ][ 0 ] ].begin() + box[ k1 ][ 1 ] ;      it1 = v[ box[ k1 ][ 0 ] ].begin();      it2 = v[ box[ k1 ][ 0 ] ].end();      int l0 = box[ k1 ][ 0 ];      int l1 = box[ k1 ][ 1 ];      while ( it != it2 )      {       v[ box[k2 ][ 0 ] ].push_back( *it );             box[ *it ][ 0 ] = box[k2 ][ 0 ];       box[ *it ][ 1 ] = v[box[k2 ][ 0 ] ].size() - 1;       it++;      }           it--;           while ( it != it1 + l1 )      {       it--;       v[ l0 ].pop_back();            }      v[ l0 ].pop_back();     }    }    cin >> s;   }   for ( int i = 0; i < n; i++ )   {    cout << i << ":";    for ( vector<int>::iterator it = v[ i ].begin(); it != v[ i ].end(); it++ )    {     cout << " " << *it;    }    cout << endl;   }   cin >> n;}return 0;}


 

原创粉丝点击