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.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Ми можемо рухатися по квадратах у порядку зверху вниз, зліва направо. Для кожного квадрата ми хочемо побачити, чи він починає підказку. Він може початися як горизонтальною, так і вертикальною підказкою. Щоб розпочати горизонтальну підказку, клітинка ліворуч має бути заблокована або поза полем, а дві клітинки праворуч мають бути вільними та на дошці. Подібним чином, щоб розпочати вертикальну підказку, клітинка вище має бути заблокована або виключена з дошки, а дві клітинки нижче мають бути на дошці та вільними.
#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); } }
Коментарі