JakeLin- [Blue Bridge Cup] [2013年の第4回Zhenti]クロスダイアグラムを印刷する-問題の解決策

問題の説明 
Xiao Mingは、以下に示すように、機関(赤十字社ではない)の十字型のロゴをデザインしました。

.. $$$$$$$$$$$$$ .. 
.. $ ........... $ .. 
$$$。$$$$$$$$$。$$ $ 
$ ... $ ....... $ ... $ 
$。$$$。$$$$$。$$$。$ 
$。$ ... $ ... $ ... $ 。$ 
$。$。$$$。$。$$$。$。$ 
$。$。$ ... $ ... $。$。$ 
$。$。$。$$$$$。$。 $。$ 
$。$。$ ... $ ... $。$。$ 
$。$。$$$。$。$$$。$。$ 
$。$ ... $ ... $ .. 。$。$ 
$。$$$。$$$$$。$$$。$ 
$ ... $ ....... $ ... $ 
$$$。$$$$$$$$ $。$$$ 
.. $ ........... $ .. 
.. $$$$$$$$$$$$$ ..

相手もコンピュータのDOSウィンドウで文字の形でロゴを出力する必要があり、レイヤーの数を任意に制御できます。 

入力

正の整数n(n <30)は、グラフィックの印刷に必要なレイヤーの数を示します。  

アウトプット

このフラグは、周囲のレイヤーの数に対応しています。

入力例

出力例

.. $$$$$$$$$$$$$ .. 
.. $ ........... $ .. 
$$$。$$$$$$$$$。$$ $ 
$ ... $ ....... $ ... $ 
$。$$$。$$$$$。$$$。$ 
$。$ ... $ ... $ ... $ 。$ 
$。$。$$$。$。$$$。$。$ 
$。$。$ ... $ ... $。$。$ 
$。$。$。$$$$$。$。 $。$ 
$。$。$ ... $ ... $。$。$ 
$。$。$$$。$。$$$。$。$ 
$。$ ... $ ... $ .. 。$。$ 
$。$$$。$$$$$。$$$。$ 
$ ... $ ....... $ ... $ 
$$$。$$$$$$$$ $。$$$ 
.. $ ........... $ .. 
.. $$$$$$$$$$$$$ ..

元のタイトルのリンク:[Blue Bridge Cup] [The 4th Zhenti 2013] Print the cross

 

簡単なグラフィックの質問、シミュレーションプロセスの段階的な分析:

ステップ1:初期化(すべて '。')

int r = 5+n*4; //总共r行r列,5是中间的十字,加上左边2n,右边2n
    for(int i=1;i<=r;i++){
        for(int j=1;j<=r;j++){
        t[i][j]='.';
    }
}

結果:


手順2:中央に十字を描画します(左上隅に1/4)

for(int i=r/2+1-2;i<=r/2+1;i++){ //中间的十字 ,最中间的坐标为(r/2+1,r/2+1)
    t[r/2+1][i]='$';
    t[i][r/2+1]='$';
}

結果:


ステップ3:[キー]周りにn個のレイヤーを描画します(左上隅の1/4)

void quater(int r,int c,int w){
    t[r][c]='$';
    for(int i=1;i<=w;i++){ //向上走 w 
        t[--r][c]='$';
    }
    for(int i=1;i<=2;i++){  //向右走 2
        t[r][++c]='$';
    }
    for(int i=1;i<=2;i++){  //向上走 2
        t[--r][c]='$';
    }
    for(int i=1;i<=w;i++){  //向右走w 
        t[r][++c]='$';
    }    
} 
{    ...
    int row = r/2+1;
    int col = r/2+1-4;
    int walk=2;
    while(n--){  //左上角四分之一,每个n为一层 ,起点为(row,col) 
        quater(row,col,walk); 
        col-=2;
        walk+=2;
    }
}

結果:


ステップ4:対称性

for(int j=r;j>r/2+1;j--) {
   for(int i=1;i<=r/2+1;i++){
       t[i][j] = t[i][r-j+1];
   }
}

結果:


ステップ5:上下対称

for(int i=r;i>r/2+1;i--){
    for(int j=1;j<=r;j++){
        t[i][j] = t[r-i+1][j];
    }
}

結果:

 これまでのところ、完全なコードが添付されています:

#include<cstdio>
#include<iostream> 
using namespace std;
char t[150][150];
void quater(int r,int c,int w){
    t[r][c]='$';
    for(int i=1;i<=w;i++){ //向上走 w 
        t[--r][c]='$';
    }
    for(int i=1;i<=2;i++){  //向右走 2
        t[r][++c]='$';
    }
    for(int i=1;i<=2;i++){  //向上走 2
        t[--r][c]='$';
    }
    for(int i=1;i<=w;i++){  //向右走w 
        t[r][++c]='$';
    }    
} 
int main(){
    int n;
    cin>>n;
    int r = 5+n*4;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=r;j++){
            t[i][j]='.';
        }
    }
    for(int i=r/2+1-2;i<=r/2+1;i++){ //中间的十字 
        t[r/2+1][i]='$';
        t[i][r/2+1]='$';
    }
    int row = r/2+1;
    int col = r/2+1-4;
    int walk=2;
    while(n--){  //左上角四分之一,每个n为一层 ,起点为(row,col) 
        quater(row,col,walk); 
        col-=2;
        walk+=2;
    }
    //左右对称
    for(int j=r;j>r/2+1;j--) {
        for(int i=1;i<=r/2+1;i++){
            t[i][j] = t[i][r-j+1];
        }
    }
    //上下对称
    for(int i=r;i>r/2+1;i--){
        for(int j=1;j<=r;j++){
            t[i][j] = t[r-i+1][j];
        }
    } 
    for(int i=1;i<=r;i++){
        for(int j=1;j<=r;j++){
            cout<<t[i][j];
        }
        cout<<endl;
    }
    return 0;
}

 

元の記事を20件公開 15 獲得 ビュー217

おすすめ

転載: blog.csdn.net/qq_37414463/article/details/105375531