考え
電流容量のこんにゃくと懸命ああ第四の質問の実際ユニバーサルセット、神、完全に一人でそれを行うか、無力ああ、それは練習を強化するため、将来はそうです!!!
私は、いわば、「無知力の問題への解決策が表示されていない、第二の外観上の問題を解決するにはなるだろう」恥ずかしい分野の一種で、今までのところ私自身のコードQAQを理解するために私の能力を超えて、他の誰かのコードを理解するために私の能力をしています..... 。
主な方法は、コピーする、(ビバテーブルをプレイ)は、単一ブロックのパターンを抑えるし、各ブロックの対応するカンバス座標を見つけることです。
キーは三点です。
- 注文が配置
あなたはこの質問には、右上にあるので(心配ビルディングブロックに関して)視野角、閉塞の問題に対処することができるように明らかである、我々は、配置した左から右へ、下から上に、フロントに戻ってする必要があります視野角この質問が変更された場合、処理の順序を変更する必要があります。 - 座標を算出
配列解析の後、我々は正方形のキャンバスに対応する座標を計算する必要があります。のみ(例えば頂点のような)特定のポイントを見つけるために、ボックスのすべての座標を検索する必要はありません。それを計算する方法、もちろん、法律を遵守するための方法を見つけることです。 - 長さの計算とは幅
あなたはこの質問が間違って行く可能性が最も高いと言うことができますキャンバスの長さと幅を見つけなければならない、キャンバスを計算して出力したい、と慎重にしなければなりません。
注:このコードは、左下隅の頂点で計算されます。
コード
#include<cstdio>
#include<iostream>
using namespace std;
const char Stick[6][8]=
{
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
};
int a[55][55];
char Paint[550][550];//画布
inline void Draw(int x,int y)//涂鸦函数
{
int i,j;
for(i=0;i<6;i++)
for(j=0;j<7;j++)
if(Stick[6-i-1][j]!='.')
Paint[x-i][y+j]=Stick[6-i-1][j];
}
int main()
{
int N,M,K(0),L,i,j,x,y;
scanf("%d%d",&N,&M);
L=4*M+2*N+1;//计算画布宽度
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
scanf("%d",&a[i][j]);
K=max(K,a[i][j]*3+2*(N-i+1)+1);//计算画布长度
}
for(i=1;i<=K;i++)
for(j=1;j<=L;j++)
Paint[i][j]='.';//画布初始化
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
x=K-2*(N-i);
y=2*(N-i)+4*(j-1)+1;//计算坐标
while(a[i][j]--)
{
Draw(x,y);//涂鸦
x-=3;//向上放
}
}
for(i=1;i<=K;i++)
{
for(j=1;j<=L;j++)
printf("%c",Paint[i][j]);
printf("\n");
}//打印画布
return 0;
}