# Gori#019(ABC039)

問題セット (opens new window)

# B - エージェント高橋君

# 概要

X=N4X = N^4となるようなNNを求めよ.

# 解法

そのまま.

#include <bits/stdc++.h>
using namespace std;

int main() {
    int X; cin >> X;
    cout << sqrt(sqrt(X)) << endl;
  return 0;
}

# C - ピアニスト高橋君

# 概要

ピアノの鍵盤は, BaseBase = WBWBWWBWBWBWWBWBWWBWという順番になっている.
ここで, 今いる鍵盤から右20個分の文字列SSが与えられた時, 今どの鍵盤にいるか求めよ.

# 解法

SSの長さは高々20文字なので, ずらす数をインデクスとしてSSと鍵盤の文字列basebaseが等しくなる部分を求めれば良い.

#include <bits/stdc++.h>
using namespace std;

int main() {
    string base = "WBWBWWBWBWBW";
    string ans[7] = {"Do", "Re", "Mi", "Fa", "So", "La", "Si"};
    string s; cin >> s;

    string ret;
    for(int bi=0; bi<base.size(); ++bi) {
      for(int si=0; si<s.size(); ++si) {
        if (base[(bi+si)%base.size()] != s[si]) break;
        if (si == s.size()-1) {
          switch(bi){
            case 0:ret = ans[0];break;
            case 2:ret = ans[1];break;
            case 4:ret = ans[2];break;
            case 5:ret = ans[3];break;
            case 7:ret = ans[4];break;
            case 9:ret = ans[5];break;
            case 11:ret = ans[6];break;
          }
          cout << ret << endl;
          return 0;
        }
      }
    }                                                                                                      
  return 0;
}

# D - 画像処理高橋君

# 概要

ある2値画像が存在する.
この画像の#の画素を周囲の8画素に拡張したH×WH \times Wの2値画像が与えられる.
元の画像を復元せよ.

# 解法

#を拡張するという操作の逆は, .を拡張するという操作である.
したがって, 逆の操作を1回行った文字列を作成することで復元画像が生成される.
その復元画像を改めて操作し, 最初に与えられた画像と等しくなることを確認すれば良い.

#include <bits/stdc++.h>
using namespace std;

int dx[8]={1, 1, 0, -1, -1, -1, 0, 1};
int dy[8]={0, 1, 1, 1, 0, -1, -1, -1};

int main() {
  int h,w;
  cin >> h >> w;
  vector< string > s(h);
  for(int hi=0;hi<h;++hi) cin >> s[hi];
  
  vector< string > ans(s);
  for(int hi=0;hi<h;++hi){
    for(int wi=0;wi<w;++wi){
      if (s[hi][wi] != '.') continue;
      for (int di=0;di<8;++di){
        int ny = hi+dy[di], nx = wi+dx[di];
        if (!(0 <= ny && ny < h && 0 <= nx && nx < w)) continue;
        ans[ny][nx] = '.';
      }
    }
  }

  vector< string > debug(ans);
  for(int hi=0;hi<h;++hi){
    for(int wi=0;wi<w;++wi){
      if (ans[hi][wi] != '#') continue;
      
      for (int di=0;di<8;++di){
        int ny = hi+dy[di], nx = wi+dx[di];
        if (!(0 <= ny && ny < h && 0 <= nx && nx < w)) continue;
        debug[ny][nx] = '#';
      }
    }
  }

  bool ok = true;
  for(int hi=0;hi<h;++hi){
    for(int wi=0;wi<w;++wi){
      ok &= s[hi][wi] == debug[hi][wi];
    }
  }
    
  if (ok) {
    cout << "possible" << endl;
    for(int hi=0;hi<h;++hi){
      cout << ans[hi] << endl;
    }
  } else {
    cout << "impossible" << endl;
  }
  return 0;
}

以上.
お疲れ様でした.

Last Updated: 1年前