ykmakuのブログ

競技プログラミングをがんばるブログ

AtCoder Regular Contest 093 D - Grid Components

  • 問題

D - Grid Components

  • 解法

まず100×100のグリッドを用意します。
上半分を白、下半分を黒で塗ります。
上半分のうち奇数行目を見ていき各行について1個おきにマス目を黒くします。A-1個のマスを黒く塗ったら終了。
こうすることで白の連結成分の数を変えずに黒の連結成分を1個ずつ増やせます。
下半分は偶数行目を見て同じようにB-1個のマスを白く塗ればよいです。

白の連結成分の数を変えずに黒の連結成分を1個ずつ増やすにはどうしたらよいかを考えると解法が浮かぶと思いました。

#include <iostream>
#include <string>

using namespace std;

int main()
{
  int a,b;
  cin >> a >> b;
  string s[100];
  for(int i = 0; i < 100; i++){
    for(int j = 0; j < 100; j++){
      if(i<50) s[i].push_back('.');
      else s[i].push_back('#');
    }
  }
  int cnt = 0;
  for(int i = 0; i < 50; i += 2){
    if(cnt == b-1) break;
    for(int j = 0; j < 100; j += 2){
      if(cnt == b-1) break;
      s[i][j] = '#';
      cnt++;
    }
  }
  cnt = 0;
  for(int i = 51; i < 100; i += 2){
    if(cnt == a-1) break;
    for(int j = 0; j < 100; j += 2){
      if(cnt == a-1) break;
      s[i][j] = '.';
      cnt++;
    }
  }
  cout << 100 << " " <<  100 << endl;
  for(int i = 0; i < 100; i++){
    cout << s[i] << endl;
  }

  return 0;
}