posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          USACO 1.1.4 Mother's Milk

          Posted on 2007-05-31 17:17 ZelluX 閱讀(705) 評論(0)  編輯  收藏 所屬分類: Algorithm
          BFS,一次通過
          /*
          PROG: milk3
          ID: 06301031
          LANG: C++
          */


          #include 
          <iostream>
          #include 
          <fstream>
          #include 
          <deque>
          #include 
          <set>

          using namespace std;

          struct Status {
              
          int a;
              
          int b;
              
          int c;
          }
          ;

          void pour(const int from, const int to, const int maxTo, int& newFrom, int& newTo) {
              newTo 
          = from + to;
              newFrom 
          = 0;
              
          if (newTo > maxTo) {
                  newFrom 
          = newTo - maxTo;
                  newTo 
          = maxTo;
              }

          }


          int main() {
              
          int i, j, k;
              ifstream fin(
          "milk3.in");
              ofstream fout(
          "milk3.out");
              Status begin;
              
          int maxA, maxB, maxC;
              fin 
          >> maxA >> maxB >> maxC;
              begin.a 
          = 0;
              begin.b 
          = 0;
              begin.c 
          = maxC;
              
              
          bool hash[21][21][21];
              
          for (i = 0; i <= maxA; i++{
                  
          for (j = 0; j <= maxB; j++{
                      
          for (k = 0; k <= maxC; k++{
                          hash[i][j][k] 
          = false;
                      }

                  }

              }

              hash[
          0][0][maxC] = true;
              
          set<int> result;

              deque
          <Status> queue;
              queue.push_back(begin);
              
          while (!queue.empty()) {
                  deque
          <Status>::iterator now = queue.begin();
                  
          if (now->== 0{
                      result.insert(now
          ->c);
                  }

                  Status newStat;
                  newStat 
          = *now;
                  pour(now
          ->a, now->b, maxB, newStat.a, newStat.b);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;   
                      queue.push_back(newStat);
                  }

                  newStat 
          = *now;
                  pour(now
          ->b, now->a, maxA, newStat.b, newStat.a);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;
                      queue.push_back(newStat);
                  }

                  newStat 
          = *now;
                  pour(now
          ->c, now->a, maxA, newStat.c, newStat.a);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;
                      queue.push_back(newStat);
                  }

                  newStat 
          = *now;
                  pour(now
          ->a, now->c, maxC, newStat.a, newStat.c);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;
                      queue.push_back(newStat);
                  }

                  newStat 
          = *now;
                  pour(now
          ->b, now->c, maxC, newStat.b, newStat.c);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;
                      queue.push_back(newStat);
                  }

                  newStat 
          = *now;
                  pour(now
          ->c, now->b, maxB, newStat.c, newStat.b);
                  
          if (!hash[newStat.a][newStat.b][newStat.c]) {
                      hash[newStat.a][newStat.b][newStat.c] 
          = true;
                      queue.push_back(newStat);
                  }


                  queue.pop_front();
              }


              
          set<int>::iterator iter = result.begin();
              fout 
          << *iter;
              iter
          ++;
              
          for (; iter != result.end(); iter++{
                  fout 
          << " " << *iter;
              }

              fout 
          << endl;
              
          return 0;
          }

          主站蜘蛛池模板: 建瓯市| 都安| 绥芬河市| 贵阳市| 周宁县| 武陟县| 靖州| 漳浦县| 凤冈县| 铁岭市| 新龙县| 津南区| 望奎县| 阜新市| 十堰市| 山东省| 景德镇市| 邹城市| 盐边县| 璧山县| 剑河县| 太康县| 景德镇市| 镇江市| 观塘区| 新营市| 改则县| 枣强县| 革吉县| 满洲里市| 永靖县| 桂东县| 武威市| 信阳市| 浪卡子县| 佛教| 广德县| 永兴县| 东方市| 瓮安县| 忻城县|