emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          公告

          常用鏈接

          留言簿(92)

          隨筆分類(20)

          隨筆檔案(171)

          文章分類(89)

          文章檔案(103)

          相冊

          收藏夾(46)

          友情連接

          收藏

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          Problem Statement

          ???? There are three stacks of crates - two of them outside of the warehouse, and one inside the warehouse. We have a crane that can move one crate at a time, and we would like to move all of the crates to the stack inside the warehouse. A heavier crate can never be stacked on top of a lighter crate, and all three initial stacks obey that rule.

          Create a class CraneWork that contains a method moves that is given int[]s stack1, stack2, and warehouse containing the initial three stacks, and returns the minimum number of moves required to move all the crates into the warehouse stack. The elements of stack1, stack2, and warehouse represent the weights of the crates and are given from top to bottom (and thus in non-decreasing order of weight).

          Definition

          ????
          Class: CraneWork
          Method: moves
          Parameters: int[], int[], int[]
          Returns: int
          Method signature: int moves(int[] stack1, int[] stack2, int[] warehouse)
          (be sure your method is public)
          ????

          Constraints

          - stack1, stack2, and warehouse will each contain between 0 and 20 elements, inclusive.
          - The total number of elements in the three stacks will be between 1 and 20, inclusive.
          - Each element in the three stacks will be between 1 and 200, inclusive.
          - stack1, stack2, and warehouse will each be in non-decreasing order.

          Examples

          0)
          ????
          {3,50}
          {}
          {1,2,50,50,50}
          Returns: 12
          Move 3 to stack2, 1 to stack1, 2 to stack2, 1 to stack2, 50 to warehouse, 1 to warehouse, 2 to stack1, 1 to stack1, 3 to warehouse, 1 to stack2, 2 to warehouse, 1 to warehouse.
          1)
          ????
          {50}
          {50}
          {10,20,30}
          Returns: 17
          Start by moving 50 from stack2 to stack1. It then takes 7 moves to transfer the 10,20,30 to stack 2, 2 moves to transfer the 2 50's to the warehouse, and 7 more to transfer the 10,20,30 to the warehouse.
          2)
          ????
          {}
          {}
          {2,5,6,7}
          Returns: 0
          All the crates are already in the warehouse.
          3)
          ????
          {1,2,3}
          {}
          {}
          Returns: 7
          Move 1 from stack1 to warehouse, 2 from stack1 to stack2, 1 from warehouse to stack2, 3 from stack1 to warehouse, 1 from stack2 to stack1, 2 from stack2 to warehouse, 1 from stack1 to warehouse.

          This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.

          posted on 2006-09-05 10:21 emu 閱讀(6646) 評論(7)  編輯  收藏 所屬分類: google編程大賽模擬題及入圍賽真題

          評論

          # re: 1000分模擬題CraneWork 2007-06-09 11:02 匿名
          #include <iostream>
          using namespace std;


          class CStack{
          public:
          CStack(){
          memset(data,0,100*sizeof(int));
          index=0;
          }
          virtual~CStack(){}
          int Pop() { sum++; return data[index--];}
          void Push(int D) { data[++index]=D; }
          int Find(int D,int I)
          {
          for(int i=I;i<=index;i++)
          if(data[i]<D)
          return i;
          return index+1;
          }
          int Show(int I)
          {
          if(index==0) return 0;
          if(I>index||I<1)
          return 0;
          return data[I];
          }
          bool Istop(int T)
          {
          if(T==index) return true;
          else return false;
          }
          void Show()
          {
          if(index==0)
          {
          cout<<"空"<<endl;
          return;
          }

          for(int i=index;i>0;i--)
          cout<<data[i]<<" ";
          cout<<endl;
          }
          public:
          static int sum;
          private:
          int data[100];
          int index;
          };
          int CStack::sum=0;

          CStack stack[3];


          void show()
          {
          cout<<"////////////////"<<endl;
          for(int i=0;i<3;i++)
          stack[i].Show();
          cout<<"////////////////"<<endl;
          }
          void CraneWork(int a,int k1,int b,int k2,int c,int k3)
          {
          int x=stack[a].Show(k1);
          int y=stack[b].Show(k2);
          int z=stack[c].Show(k3);
          if(x==0&&y==0) return;

          if(z>=x&&z>=y)
          {
          if(x>=y)
          {
          int k=stack[c].Find(x,k3);
          CraneWork(a,k1+1,c,k,b,k2);
          stack[c].Push(stack[a].Pop());
          show();
          CraneWork(b,k2,a,k1,c,k+1);
          }
          else
          {
          int k=stack[c].Find(y,k3);
          CraneWork(b,k2+1,c,k,a,k1);
          stack[c].Push(stack[b].Pop());
          CraneWork(a,k1,b,k2,c,k+1);
          }
          }
          if(x>z&&x>=y)
          {
          if(x==y)
          {
          if(stack[a].Istop(k1)&&stack[b].Istop(k2))
          {
          stack[a].Push(stack[b].Pop());
          CraneWork(a,k1+2,c,k3,b,k2);
          stack[c].Push(stack[a].Pop());
          stack[c].Push(stack[a].Pop());
          CraneWork(a,k1,b,k2,c,k3+2);
          return;
          }
          }
          CraneWork(a,k1+1,c,k3,b,k2);
          stack[c].Push(stack[a].Pop());
          show();
          CraneWork(a,k1,b,k2,c,k3+1);

          }
          if(y>z&&y>x)
          {
          CraneWork(b,k2+1,c,k3,a,k1);
          stack[c].Push(stack[b].Pop());
          show();
          CraneWork(a,k1,b,k2,c,k3+1);
          }
          }



          int _tmain(int argc, _TCHAR* argv[])
          {
          /*stack[0].Push(50);
          stack[0].Push(3);
          stack[2].Push(50);
          stack[2].Push(50);
          stack[2].Push(50);
          stack[2].Push(2);
          stack[2].Push(1);*/
          /*stack[0].Push(3);
          stack[0].Push(2);
          stack[0].Push(1);*/
          stack[0].Push(50);
          stack[1].Push(50);
          stack[2].Push(30);
          stack[2].Push(20);
          stack[2].Push(10);


          show();
          CraneWork(0,1,1,1,2,1);
          show();
          cout<<"次數為:"<<CStack::sum<<endl;
          return 0;
          }
            回復  更多評論
            

          # re: 1000分模擬題CraneWork [未登錄] 2007-08-06 18:52 zero
          very easy!  回復  更多評論
            

          # re: 1000分模擬題CraneWork [未登錄] 2007-11-11 22:23 y
          g sdfg  回復  更多評論
            

          # re: 1000分模擬題CraneWork 2008-09-19 09:26
          比賽題目都是英文么  回復  更多評論
            

          # re: 1000分模擬題CraneWork 2008-09-22 11:21 hejian
          這是一道漢諾塔的變種題,不知使用進位迭代的方式還有沒有效,有時間可以試一下。  回復  更多評論
            

          # re: 1000分模擬題CraneWork 2008-11-27 17:59 誠人
          一直對google技術佩服!我也要研究一番。  回復  更多評論
            

          # re: 1000分模擬題CraneWork [未登錄] 2010-10-03 23:54 無名
          鑒定完畢,此程序有問題。  回復  更多評論
            

          主站蜘蛛池模板: 镇雄县| 新宾| 申扎县| 中方县| 黄浦区| 庄浪县| 仲巴县| 凤阳县| 冷水江市| 通许县| 都匀市| 凤翔县| 黄骅市| 凤阳县| 海伦市| 仙桃市| 宣恩县| 开封县| 南安市| 宁德市| 伊金霍洛旗| 武宣县| 临高县| 宁国市| 长乐市| 金秀| 威远县| 中方县| 霍林郭勒市| 汪清县| 房产| 五常市| 理塘县| 伊金霍洛旗| 怀远县| 沙洋县| 赣州市| 桂平市| 乐山市| 黄陵县| 临洮县|