日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1149 立体图

發布時間:2025/5/22 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 Input

3 4

2 2 1 2

2 2 1 1

3 2 1 2

樣例輸出?Sample Output

......+---+---+...+---+

..+---+?? /??? /|../?? /|

./??? /|-+---+ |.+---+ |

+---+ |/?? /| +-|??? | +

|??? | +---+ |/+---+ |/|

|??? |/?? /| +/??? /|-+ |

+---+---+ |/+---+ |/| +

|??? |?? | +-|??? | + |/.

|??? |?? |/? |??? |/| +..

+---+---+---+---+ |/...

|??? |?? |??? |?? | +....

|??? |?? |??? |?? |/.....

+---+---+---+---+......

數據范圍及提示?Data Size & Hint

分類標簽?Tags?點此展開?

NOIP全國聯賽普及組?大陸地區?2008年

題解:(其實我也沒太讀懂這所謂"普及組"的題目,那就先這樣模擬吧)

這道題實際上是利用了立體幾何的透視原理?
我們可以從后面往前畫?
這是一種非常奇怪的方法?
但是卻非常有效

我們可以先寫一個函數?
畫一個立方體

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]='+'; }

其實這一步是十分好想的?
自己畫圖就能想出來?
接下來是計算長度和寬度

經過我個人運算

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

總結

以上是生活随笔為你收集整理的1149 立体图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。