1149 立体图
1149 立體圖
?2008年NOIP全國聯賽普及組
?時間限制: 1 s ?空間限制: 128000 KB ?題目等級 : 鉆石 Diamond 題解 ?查看運行結果 題目描述?Description小淵是個聰明的孩子,他經常會給周圍的小朋友們講些自己認為有趣的內容。最近,他準備給小朋友們講解立體圖,請你幫他畫出立體圖。
小淵有一塊面積為m*n的矩形區域,上面有m*n個邊長為1的格子,每個格子上堆了一些同樣大小的吉姆(積木的長寬高都是1),小淵想請你打印出這些格子的立體圖。我們定義每個積木為如下格式,并且不會做任何翻轉旋轉,只會嚴格以這一種形式擺放:
? +---+
?/?? /|? 高
+---+ |
|?? | +
|?? |/ 寬
+---+
?長
每個頂點用1個加號’+’表示,長用3個”-“表示,寬用1個”/”表示,高用兩個”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII碼分別為43,45,47,124。字符’.’(ASCII碼46)需要作為背景輸出,即立體圖里的空白部分需要用’.’代替。立體圖的畫法如下面的規則:
若兩塊積木左右相鄰,圖示為:
..+---+---+
./?? /?? /|
+---+---+ |
|?? |?? | +
|?? |?? |/.
+---+---+..
若兩塊積木上下相鄰,圖示為:
..+---+
./?? /|
+---+ |
|?? | +
|?? |/|
+---+ |
| ??| +
|?? |/.
+---+..
若兩塊積木前后相鄰,圖示為:
….+---+
…/?? /|
..+---+ |
./?? /| +
+---+ |/.
|?? | +..
|?? |/…
+---+….
立體圖中,定義位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一塊積木(即最下面的一塊積木)的左下角頂點為整張圖最左下角的點。
輸入描述?Input Description輸入文件drawing.in第一行有用空格隔開的兩個整數m和n,表示有m*n個格子(1<=m,n<=50)。
接下來的m行,是一個m*n的矩陣,每行有n個用空格隔開的整數,其中第i行第j列上的整數表示第i行第j列的格子上摞有多少個積木(1<=每個格子上的積木數<=100)。
輸出描述?Output Description輸出文件drawing.out中包含題目要求的立體圖,是一個K行L列的字符矩陣,其中K和L表示最少需要K行L列才能按規定輸出立體圖。
樣例輸入?Sample Input3 4
2 2 1 2
2 2 1 1
3 2 1 2
樣例輸出?Sample Output......+---+---+...+---+
..+---+?? /??? /|../?? /|
./??? /|-+---+ |.+---+ |
+---+ |/?? /| +-|??? | +
|??? | +---+ |/+---+ |/|
|??? |/?? /| +/??? /|-+ |
+---+---+ |/+---+ |/| +
|??? |?? | +-|??? | + |/.
|??? |?? |/? |??? |/| +..
+---+---+---+---+ |/...
|??? |?? |??? |?? | +....
|??? |?? |??? |?? |/.....
+---+---+---+---+......
數據范圍及提示?Data Size & Hint分類標簽?Tags?點此展開?
NOIP全國聯賽普及組?大陸地區?2008年題解:(其實我也沒太讀懂這所謂"普及組"的題目,那就先這樣模擬吧)
這道題實際上是利用了立體幾何的透視原理?
我們可以從后面往前畫?
這是一種非常奇怪的方法?
但是卻非常有效
我們可以先寫一個函數?
畫一個立方體
其實這一步是十分好想的?
自己畫圖就能想出來?
接下來是計算長度和寬度
經過我個人運算
w=4*n+2*m+1; for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)h=max(h,H[i][j]*3+3+2*(m-i));?
AC代碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 51 int n,m,w,h,H[N][N]; char p[N*20][N*20]; inline void deal(int x,int y){for(int i=y+1;i<y+4;i++)p[x][i]=p[x-3][i]=p[x-5][i+2]='-';for(int i=x-1;i>x-3;i--)p[i][y]=p[i][y+4]=p[i-2][y+6]='|';for(int i=x-1;i>x-3;i--)for(int j=y+1;j<y+4;j++)p[i][j]=' ';for(int i=x-2;i>x-4;i--)p[i][y+5]=' ';for(int i=y+2;i<y+5;i++)p[x-4][i]=' ';p[x][y]=p[x-3][y]=p[x][y+4]=p[x-3][y+4]='+';p[x-4][y+1]=p[x-4][y+5]=p[x-1][y+5]='/';p[x-5][y+2]=p[x-5][y+6]=p[x-2][y+6]='+'; } int main(){cin>>m>>n;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)cin>>H[i][j];w=4*n+2*m+1;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)h=max(h,H[i][j]*3+3+2*(m-i));for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)p[i][j]='.';for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)for(int k=1;k<=H[i][j];k++)deal(h-2*(m-i)-3*(k-1),4*(j-1)+1+(m-i)*2);for(int i=1;i<=h;i++){for(int j=1;j<=w;j++)cout<<p[i][j];cout<<endl;}return 0; }?
轉載于:https://www.cnblogs.com/shenben/p/5653698.html
總結
- 上一篇: SSL介绍与Java实例
- 下一篇: 常用的Firefox浏览器插件、Chro