Editorial for 1985: Кросворд


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: zvit

Ми можемо рухатися по квадратах у порядку зверху вниз, зліва направо. Для кожного квадрата ми хочемо побачити, чи він починає підказку. Він може початися як горизонтальною, так і вертикальною підказкою. Щоб розпочати горизонтальну підказку, клітинка ліворуч має бути заблокована або поза полем, а дві клітинки праворуч мають бути вільними та на дошці. Подібним чином, щоб розпочати вертикальну підказку, клітинка вище має бути заблокована або виключена з дошки, а дві клітинки нижче мають бути на дошці та вільними.

#include <cstdio>
#include <vector>

#define MP make_pair
#define PB push_back
#define X first
#define Y second

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

int main() {
  ll R, C;
  scanf("%lld %lld\n", &R, &C);
  vector<vector<char> > G(R, vector<char>(C, ' '));
  for(ll r=0; r<R; r++) {
    char buf[100];
    scanf("%s", buf);
    for(ll c=0; c<C; c++) {
      G[r][c] = buf[c];
    }
  }
  vector<pll> A;

  for(ll r=0; r<R; r++) {
    for(ll c=0; c<C; c++) {
      bool horizontal = (c+2<C && G[r][c]=='.' && G[r][c+1]=='.' && G[r][c+2]=='.' &&
                         (c==0 || G[r][c-1]=='#'));
      bool vertical = (r+2<R && G[r][c]=='.' && G[r+1][c]=='.' && G[r+2][c]=='.' &&
                       (r==0 || G[r-1][c]=='#'));
      if(horizontal || vertical) {
        A.PB(MP(r+1, c+1));
      }
    }
  }
  printf("%lu\n", A.size());
  for(pll clue : A) {
    printf("%lld %lld\n", clue.X, clue.Y);
  }
}

Коментарі

Please read the guidelines before commenting.


Ще немає коментарів.