堆放木塊C++實現

來源:互聯網
上載者:User

   堆放木塊是題很有意思的題目,原題的描述為:

  我們用2維數組n[i][j] 表示平面上凸起的高度。或者說在二維平面上堆放立方體,滿足 (每個數組元素都是非負整數) 

  n[i][j] <= n[i][j+1] n[i][j] <= n[i+1][j]

  ,是一種合法的方法。 對應的二維數組是:5 4 2 1 13 2 0 0 02 2 0 0 0 (注意正方向是從下往上,從右往左) 給定a,b,c,其中a,b是2維數組的維數,c表示元素不超過c(即n[i,j] <= c),求滿足條件的2維數組的數量。 (0<a,b,c<=6) 

之前我就分析過了,這題與ferrers圖有很大的聯絡,再看看Ferrers圖:

ferrers圖是一個從上而下的n層格子,mi 為第i層的格子數,當mi>=mi+1(i=1,2,,n-1) ,即上層的格子數不少於下層的格子數的圖。

如下是一些ferrers圖:



所以,可以看到,每個合理的擺放每一層都是一個ferrers圖,且下層圖的格子數不能比上層的格子數小,即每一列都不能小,然後至多堆放c層,這樣,思路就有了

因為我不會寫java,所以我先用c++實現打了個表,下面是我的C++代碼實現;

/*******************************************************************************//* OS           : Linux fc20.x86_64 #1 SMP Tue Dec  UTC 2013 x86_64  GNU/Linux * Compiler     : 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) * Encoding     : UTF8 * Date         : 2014-03-21 * All Rights Reserved by alop.*****************************************************************************//* Description: ********************************************************************************************************************************************//* Analysis: ***********************************************************************************************************************************************//*****************************************************************************/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;long long D[7][7][7][7][7][7][7];int main(){freopen("in.txt","w",stdout);   int a[7],b[7];   for(a[1]=1;a[1]<7;a[1]++)     for(a[2]=0;a[2]<=a[1];a[2]++)      for(a[3]=0;a[3]<=a[2];a[3]++)        for(a[4]=0;a[4]<=a[3];a[4]++)          for(a[5]=0;a[5]<=a[4];a[5]++)            for(a[6]=0;a[6]<=a[5];a[6]++)             D[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][1]=1;for(int i=2;i<=6;i++)   for(a[1]=1;a[1]<7;a[1]++)     for(a[2]=0;a[2]<=a[1];a[2]++)      for(a[3]=0;a[3]<=a[2];a[3]++)        for(a[4]=0;a[4]<=a[3];a[4]++)          for(a[5]=0;a[5]<=a[4];a[5]++)            for(a[6]=0;a[6]<=a[5];a[6]++)            {               D[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][i]=0;               for(b[1]=1;b[1]<=a[1];b[1]++)                 for(b[2]=0;b[2]<=min(b[1],a[2]);b[2]++)                  for(b[3]=0;b[3]<=min(b[2],a[3]);b[3]++)                    for(b[4]=0;b[4]<=min(b[3],a[4]);b[4]++)                        for(b[5]=0;b[5]<=min(b[4],a[5]);b[5]++)                            for(b[6]=0;b[6]<=min(b[5],a[6]);b[6]++)                                D[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][i]+= D[b[1]][b[2]][b[3]][b[4]][b[5]][b[6]][i-1];                            }for(int c=1;c<=6;c++)  {    long long fer=1;    for(int d=1;d<=6;d++)    {    for(a[1]=1;a[1]<=d;a[1]++)      for(int i=1;i<=c;i++)       fer+= D[a[1]][0][0][0][0][0][i];      cout<<"fs["<<d<<"][1]["<<c<<"]="<<fer<<"L ;";      fer=1;      }    cout<<endl;for(int d=1;d<=6;d++){for(a[1]=1;a[1]<=d;a[1]++)for(a[2]=0;a[2]<=a[1];a[2]++)      for(int i=1;i<=c;i++)       fer+= D[a[1]][a[2]][0][0][0][0][i];      cout<<"fs["<<d<<"][2]["<<c<<"]="<<fer<<"L;  ";      fer=1;      }    cout<<endl;for(int d=1;d<=6;d++){for(a[1]=1;a[1]<=d;a[1]++)  for(a[2]=0;a[2]<=a[1];a[2]++)     for(a[3]=0;a[3]<=a[1];a[3]++)      for(int i=1;i<=c;i++)       fer+= D[a[1]][a[2]][a[3]][0][0][0][i];      cout<<"fs["<<d<<"][3]["<<c<<"]="<<fer<<"L  ; ";      fer=1;      }    cout<<endl;for(int d=1;d<=6;d++){for(a[1]=1;a[1]<=d;a[1]++)  for(a[2]=0;a[2]<=a[1];a[2]++)     for(a[3]=0;a[3]<=a[1];a[3]++)       for(a[4]=0;a[4]<=a[3];a[4]++)      for(int i=1;i<=c;i++)       fer+= D[a[1]][a[2]][a[3]][a[4]][0][0][i];      cout<<"fs["<<d<<"][4]["<<c<<"]="<<fer<<"L   ;";      fer=1;      }    cout<<endl;    for(int d=1;d<=6;d++){for(a[1]=1;a[1]<=d;a[1]++)  for(a[2]=0;a[2]<=a[1];a[2]++)     for(a[3]=0;a[3]<=a[1];a[3]++)       for(a[4]=0;a[4]<=a[3];a[4]++)         for(a[5]=0;a[5]<=a[4];a[5]++)      for(int i=1;i<=c;i++)       fer+= D[a[1]][a[2]][a[3]][a[4]][a[5]][0][i];      cout<<"fs["<<d<<"][5]["<<c<<"]="<<fer<<"L   ;";      fer=1;      }    cout<<endl;for(int d=1;d<=6;d++){for(a[1]=1;a[1]<=d;a[1]++)  for(a[2]=0;a[2]<=a[1];a[2]++)     for(a[3]=0;a[3]<=a[1];a[3]++)       for(a[4]=0;a[4]<=a[3];a[4]++)         for(a[5]=0;a[5]<=a[4];a[5]++)           for(a[6]=0;a[6]<=a[5];a[6]++)            for(int i=1;i<=c;i++)       fer+= D[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][i];      cout<<"fs["<<d<<"][6]["<<c<<"]="<<fer<<"L  ;";      fer=1;      }    cout<<endl;  }    return 0;fclose(stdout);}

可以看到,我寫了超多的for迴圈,但其實思路是很清晰的,就是ferrers圖的層層疊加;下面是輸出資料:

fs[1][1][1]=2L ;fs[2][1][1]=3L ;fs[3][1][1]=4L ;fs[4][1][1]=5L ;fs[5][1][1]=6L ;fs[6][1][1]=7L ;
fs[1][2][1]=3L;  fs[2][2][1]=6L;  fs[3][2][1]=10L;  fs[4][2][1]=15L;  fs[5][2][1]=21L;  fs[6][2][1]=28L;  
fs[1][3][1]=4L  ; fs[2][3][1]=10L  ; fs[3][3][1]=20L  ; fs[4][3][1]=35L  ; fs[5][3][1]=56L  ; fs[6][3][1]=84L  ; 
fs[1][4][1]=5L   ;fs[2][4][1]=15L   ;fs[3][4][1]=35L   ;fs[4][4][1]=70L   ;fs[5][4][1]=126L   ;fs[6][4][1]=210L   ;
fs[1][5][1]=6L   ;fs[2][5][1]=21L   ;fs[3][5][1]=56L   ;fs[4][5][1]=126L   ;fs[5][5][1]=252L   ;fs[6][5][1]=462L   ;
fs[1][6][1]=7L  ;fs[2][6][1]=28L  ;fs[3][6][1]=84L  ;fs[4][6][1]=210L  ;fs[5][6][1]=462L  ;fs[6][6][1]=924L  ;
fs[1][1][2]=3L ;fs[2][1][2]=6L ;fs[3][1][2]=10L ;fs[4][1][2]=15L ;fs[5][1][2]=21L ;fs[6][1][2]=28L ;
fs[1][2][2]=6L;  fs[2][2][2]=20L;  fs[3][2][2]=50L;  fs[4][2][2]=105L;  fs[5][2][2]=196L;  fs[6][2][2]=336L;  
fs[1][3][2]=10L  ; fs[2][3][2]=50L  ; fs[3][3][2]=175L  ; fs[4][3][2]=490L  ; fs[5][3][2]=1176L  ; fs[6][3][2]=2520L  ; 
fs[1][4][2]=15L   ;fs[2][4][2]=105L   ;fs[3][4][2]=490L   ;fs[4][4][2]=1764L   ;fs[5][4][2]=5292L   ;fs[6][4][2]=13860L   ;
fs[1][5][2]=21L   ;fs[2][5][2]=196L   ;fs[3][5][2]=1176L   ;fs[4][5][2]=5292L   ;fs[5][5][2]=19404L   ;fs[6][5][2]=60984L   ;
fs[1][6][2]=28L  ;fs[2][6][2]=336L  ;fs[3][6][2]=2520L  ;fs[4][6][2]=13860L  ;fs[5][6][2]=60984L  ;fs[6][6][2]=226512L  ;
fs[1][1][3]=4L ;fs[2][1][3]=10L ;fs[3][1][3]=20L ;fs[4][1][3]=35L ;fs[5][1][3]=56L ;fs[6][1][3]=84L ;
fs[1][2][3]=10L;  fs[2][2][3]=50L;  fs[3][2][3]=175L;  fs[4][2][3]=490L;  fs[5][2][3]=1176L;  fs[6][2][3]=2520L;  
fs[1][3][3]=20L  ; fs[2][3][3]=175L  ; fs[3][3][3]=980L  ; fs[4][3][3]=4116L  ; fs[5][3][3]=14112L  ; fs[6][3][3]=41580L  ; 
fs[1][4][3]=35L   ;fs[2][4][3]=490L   ;fs[3][4][3]=4116L   ;fs[4][4][3]=24696L   ;fs[5][4][3]=116424L   ;fs[6][4][3]=457380L   ;
fs[1][5][3]=56L   ;fs[2][5][3]=1176L   ;fs[3][5][3]=14112L   ;fs[4][5][3]=116424L   ;fs[5][5][3]=731808L   ;fs[6][5][3]=3737448L   ;
fs[1][6][3]=84L  ;fs[2][6][3]=2520L  ;fs[3][6][3]=41580L  ;fs[4][6][3]=457380L  ;fs[5][6][3]=3737448L  ;fs[6][6][3]=24293412L  ;
fs[1][1][4]=5L ;fs[2][1][4]=15L ;fs[3][1][4]=35L ;fs[4][1][4]=70L ;fs[5][1][4]=126L ;fs[6][1][4]=210L ;
fs[1][2][4]=15L;  fs[2][2][4]=105L;  fs[3][2][4]=490L;  fs[4][2][4]=1764L;  fs[5][2][4]=5292L;  fs[6][2][4]=13860L;  
fs[1][3][4]=35L  ; fs[2][3][4]=490L  ; fs[3][3][4]=4116L  ; fs[4][3][4]=24696L  ; fs[5][3][4]=116424L  ; fs[6][3][4]=457380L  ; 
fs[1][4][4]=70L   ;fs[2][4][4]=1764L   ;fs[3][4][4]=24696L   ;fs[4][4][4]=232848L   ;fs[5][4][4]=1646568L   ;fs[6][4][4]=9343620L   ;
fs[1][5][4]=126L   ;fs[2][5][4]=5292L   ;fs[3][5][4]=116424L   ;fs[4][5][4]=1646568L   ;fs[5][5][4]=16818516L   ;fs[6][5][4]=133613766L   ;
fs[1][6][4]=210L  ;fs[2][6][4]=13860L  ;fs[3][6][4]=457380L  ;fs[4][6][4]=9343620L  ;fs[5][6][4]=133613766L  ;fs[6][6][4]=1447482465L  ;
fs[1][1][5]=6L ;fs[2][1][5]=21L ;fs[3][1][5]=56L ;fs[4][1][5]=126L ;fs[5][1][5]=252L ;fs[6][1][5]=462L ;
fs[1][2][5]=21L;  fs[2][2][5]=196L;  fs[3][2][5]=1176L;  fs[4][2][5]=5292L;  fs[5][2][5]=19404L;  fs[6][2][5]=60984L;  
fs[1][3][5]=56L  ; fs[2][3][5]=1176L  ; fs[3][3][5]=14112L  ; fs[4][3][5]=116424L  ; fs[5][3][5]=731808L  ; fs[6][3][5]=3737448L  ; 
fs[1][4][5]=126L   ;fs[2][4][5]=5292L   ;fs[3][4][5]=116424L   ;fs[4][4][5]=1646568L   ;fs[5][4][5]=16818516L   ;fs[6][4][5]=133613766L   ;
fs[1][5][5]=252L   ;fs[2][5][5]=19404L   ;fs[3][5][5]=731808L   ;fs[4][5][5]=16818516L   ;fs[5][5][5]=267227532L   ;fs[6][5][5]=3184461423L   ;
fs[1][6][5]=462L  ;fs[2][6][5]=60984L  ;fs[3][6][5]=3737448L  ;fs[4][6][5]=133613766L  ;fs[5][6][5]=3184461423L  ;fs[6][6][5]=55197331332L  ;
fs[1][1][6]=7L ;fs[2][1][6]=28L ;fs[3][1][6]=84L ;fs[4][1][6]=210L ;fs[5][1][6]=462L ;fs[6][1][6]=924L ;
fs[1][2][6]=28L;  fs[2][2][6]=336L;  fs[3][2][6]=2520L;  fs[4][2][6]=13860L;  fs[5][2][6]=60984L;  fs[6][2][6]=226512L;  
fs[1][3][6]=84L  ; fs[2][3][6]=2520L  ; fs[3][3][6]=41580L  ; fs[4][3][6]=457380L  ; fs[5][3][6]=3737448L  ; fs[6][3][6]=24293412L  ; 
fs[1][4][6]=210L   ;fs[2][4][6]=13860L   ;fs[3][4][6]=457380L   ;fs[4][4][6]=9343620L   ;fs[5][4][6]=133613766L   ;fs[6][4][6]=1447482465L   ;
fs[1][5][6]=462L   ;fs[2][5][6]=60984L   ;fs[3][5][6]=3737448L   ;fs[4][5][6]=133613766L   ;fs[5][5][6]=3184461423L   ;fs[6][5][6]=55197331332L   ;
fs[1][6][6]=924L  ;fs[2][6][6]=226512L  ;fs[3][6][6]=24293412L  ;fs[4][6][6]=1447482465L  ;fs[5][6][6]=55197331332L  ;fs[6][6][6]=1478619421136L  ;

就這樣,這題就完美解決了!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.