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

          Young tableaus

          Posted on 2007-07-23 17:51 ZelluX 閱讀(421) 評論(0)  編輯  收藏 所屬分類: Algorithm
          CLRS上第六章的習題,以前感覺挺難的,現在仔細想了發現其實和堆是一樣的。
          /* Min-Young tableaus on Page 143 */
          #include 
          <iostream>
          #include 
          <iomanip>
          using namespace std;

          template 
          <class Type>
          class YTable
          {
          private:
              Type
          ** data;
              
          int m, n;
              
          const static int INFINITY = 9999;
          public:
              YTable(
          int m = 10int n = 10);
              
          ~YTable();
              
          int Insert(Type x);
              
          int FloatUp(int x, int y);
              
          int Print();
              
          int Extract(int x, int y, Type value);
          };

          template 
          <class Type>
          YTable
          <Type>::YTable(int m, int n)
          {
              
          this->= m;
              
          this->= n;
              data 
          = new Type*[m];
              
          for (int i = 0; i < m; i++)
                  data[i] 
          = new Type[n];
              
          for (int i = 0; i < m; i++)
                  
          for (int j = 0; j < n; j++)
                      data[i][j] 
          = INFINITY;
          }

          template 
          <class Type>
          YTable
          <Type>::~YTable()
          {
              
          for (int i = 0; i < m; i++)
                  delete [] data[i];
              delete [] data;
          }

          template 
          <class Type>
          int YTable<Type>::Insert(Type x)
          {
              
          if (data[m - 1][n - 1!= INFINITY)
                  
          return 0;
              data[m 
          - 1][n - 1= x;
              FloatUp(m 
          - 1, n - 1);
              
          return 1;
          }

          template 
          <class Type>
          int YTable<Type>::FloatUp(int x, int y)
          {
              
          int maxX = x;
              
          int maxY = y;
              
          if (x > 0 && data[x - 1][y] > data[maxX][maxY])
              {
                  maxX 
          = x - 1;
                  maxY 
          = y;
              }
              
          if (y > 0 && data[x][y - 1> data[maxX][maxY])
              {
                  maxX 
          = x;
                  maxY 
          = y - 1;
              }
              
          if (maxX != x || maxY != y)
              {
                  swap(data[maxX][maxY], data[x][y]);
                  FloatUp(maxX, maxY);
              }
              
          return 1;
          }

          template 
          <class Type>
          int YTable<Type>::Print()
          {
              cout.setf(ios::
          fixed);
              
          for (int i = 0; i < m; i++)
              {
                  
          for (int j = 0; j < n; j++)
                      
          if (data[i][j] != INFINITY)
                          cout 
          << setw(3<< data[i][j];
                      
          else
                          cout 
          << " X ";
                  cout 
          << endl;
              }
              
          return 1;
          }

          template 
          <class Type>
          int YTable<Type>::Extract(int x, int y, Type value)
          {
              data[x][y] 
          = value;
              FloatUp(x, y);
              
          return 1;
          }

          int main()
          {
              YTable
          <int> myTable(44);
              
          int x[] = {91632481514127111015136};
              
          for (int i = 0; i < 16; i++)
                  myTable.Insert(x[i]);
              cout 
          << "Initial state:\n";
              myTable.Print();
              cout 
          << "\nNow change (4,3) to 5:\n";
              myTable.Extract(
          325);
              myTable.Print();
              
          return 0;
          }
              


          主站蜘蛛池模板: 桑植县| 辽源市| 文成县| 呼玛县| 绵阳市| 如皋市| 衡南县| 安陆市| 阳东县| 罗山县| 抚顺县| 伊宁县| 长垣县| 牙克石市| 丹凤县| 永兴县| 石景山区| 冕宁县| 马鞍山市| 容城县| 永州市| 鄯善县| 武冈市| 马龙县| 廊坊市| 罗源县| 神木县| 新疆| 沈阳市| 遂平县| 梅州市| 临澧县| 孝感市| 齐河县| 南昌县| 五常市| 阿拉善左旗| 景德镇市| 苍南县| 邢台市| 雷山县|