UnKoder #05 A Print Cuboid

2015/05/20 (Wed) hackerrank UnKoder 実装

問題

問題文

方針

一応「やるだけ」だけど上手に実装するのは難しい。 僕は縦横斜めの辺と頂点をそれぞれ独立に塗った.

実装

// trim from end
static inline std::string &rtrim(std::string &s) {
    s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
    return s;
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int W,H,D;
    cin >> W >> H >> D;
    char g[100][100];
    memset(g,' ',sizeof(g));
    // ---
    {
        int rs[] = {0,D+1,D+H+2};
        int cs[] = {D+1,0,0};
        rep(k,3){
            rep(i,W+2) g[rs[k]][cs[k]+i] = '-';
        }
    }
    // |
    {
        int rs[] = {0,D+1,D+1};
        int cs[] = {D+W+2,0,W+1};
        rep(k,3){
            rep(i,H+2) g[rs[k]+i][cs[k]] = '|';
        }
    }
    // /
    {
        int rs[] = {D+1,D+1,D+H+2};
        int cs[] = {0,W+1,W+1};
        rep(k,3){
            rep(i,D+2) g[rs[k]-i][cs[k]+i] = '/';
        }
    }
    g[0][D+1] = g[0][D+W+2] = '+';
    g[D+1][0] = g[D+1][W+1] = '+';
    g[D+H+2][0] = g[D+H+2][W+1] = '+';
    g[H+1][D+W+2] = '+';
    rep(i,D+H+3){
        string r = string(g[i],g[i]+D+W+3);
        cout << rtrim(r) << endl;
    }
}