問題の説明
Xiao Mingは、以下に示すように、機関(赤十字社ではない)の十字型のロゴをデザインしました。.. $$$$$$$$$$$$$ .. .. $ ........... $ .. $$$。$$$$$$$$$。$$ $ $ ... $ ....... $ ... $ $。$$$。$$$$$。$$$。$ $。$ ... $ ... $ ... $ 。$ $。$。$$$。$。$$$。$。$ $。$。$ ... $ ... $。$。$ $。$。$。$$$$$。$。 $。$ $。$。$ ... $ ... $。$。$ $。$。$$$。$。$$$。$。$ $。$ ... $ ... $ .. 。$。$ $。$$$。$$$$$。$$$。$ $ ... $ ....... $ ... $ $$$。$$$$$$$$ $。$$$ .. $ ........... $ .. .. $$$$$$$$$$$$$ ..相手もコンピュータのDOSウィンドウで文字の形でロゴを出力する必要があり、レイヤーの数を任意に制御できます。
入力
正の整数n(n <30)は、グラフィックの印刷に必要なレイヤーの数を示します。
アウトプット
このフラグは、周囲のレイヤーの数に対応しています。
入力例
3出力例
.. $$$$$$$$$$$$$ .. .. $ ........... $ .. $$$。$$$$$$$$$。$$ $ $ ... $ ....... $ ... $ $。$$$。$$$$$。$$$。$ $。$ ... $ ... $ ... $ 。$ $。$。$$$。$。$$$。$。$ $。$。$ ... $ ... $。$。$ $。$。$。$$$$$。$。 $。$ $。$。$ ... $ ... $。$。$ $。$。$$$。$。$$$。$。$ $。$ ... $ ... $ .. 。$。$ $。$$$。$$$$$。$$$。$ $ ... $ ....... $ ... $ $$$。$$$$$$$$ $。$$$ .. $ ........... $ .. .. $$$$$$$$$$$$$ ..
元のタイトルのリンク:[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;
}