Pの競プロ記

競技プログラミングに関することを書きます。

TopCoder SRM 633 Div2 Easy : Target

概要

#####
#   #
# # #
#   #
#####

#########
#       #
# ##### #
# #   # #  
# # # # #
# #   # #
# ##### #
#       #
#########

↑みたいな感じのを出力せよ。というSRMではあんまり見ない感じの問題。

解法


やるだけ問題。

しかしどう実装するか悩んだ挙句、クソコードを書いてしまった。

あとから他のコードを眺めてみたら非常にシンプルに書いてあったので、こういう書き方ができるようになりたい。

下のソースコードコメントアウトしてるのが最初のクソコードで、その下がシンプルな書き方。
"#"の判定は、中心とその座標の差のうち大きいほうが2で割り切れるかどうか。

ソースコード

class Target {
public:

  vector <string> draw(int n) {
    // char G[50][50];
    
    // rep(i, n) rep(j, n) G[i][j] = ' ';

    // for(int i = 0; i <= n / 2; i += 2) {
    //   for(int j = 0; j < n - i * 2; j++) {
    //     G[i][j + i] = '#';
    //     G[j + i][i] = '#';
    //     G[n - i - 1][j + i] = '#';
    //     G[j + i][n - i - 1] = '#';
    //   }
    // }
    
    // vector<string> ans;
    // rep(i, n) {
    //   string tmp = "";
    //   rep(j, n) tmp += (G[i][j] == '#' ? G[i][j] : ' ');
    //   ans.pb(tmp);
    // }
    
    // return ans;

    vector<string> ans(n, string(n, ' '));
    rep(i, n) rep(j, n) {
      if(max(abs(i - n / 2), abs(j - n / 2)) % 2 == 0) ans[i][j] = '#';
    }
    return ans;
  }
};