Submission #1230524

#TimeUsernameProblemLanguageResultExecution timeMemory
1230524justToy (CEOI24_toy)C++20
0 / 100
1147 ms66336 KiB
#include "bits/stdc++.h"
using namespace std;
 
#define vec vector
#define int long long
#define all(x) (x).begin(), (x).end()
 
const int mod = 1e9 + 7;
const int inf = LLONG_MAX;
 
using pii = pair<int, int>;

using Point = pii;
#define X first
#define Y second


int n, m, w, h;
bool grid[100][100];
Point start;


bool valid(Point p) {
    return p.X >= 0 && p.X < n && p.Y >= 0 && p.Y < m && !grid[p.X][p.Y];
}

Point meeting_point(Point H, Point V) {
    return {H.X, V.Y};
}

bool valid(Point H, Point V) {
    if (!valid(H) || !valid(V)) return false;
    if (V.Y - H.Y > w || H.X - V.X > h) return false;
    
    for (int i = 0; i < w; i++) {
        if (!valid({H.X, H.Y + i})) return false;
    }

    for (int i = 0; i < h; i++) {
        if (!valid({V.X + i, V.Y})) return false;
    }

    return true;
}

char print_buf[100][100];
void print(Point H, Point V) {
    for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) print_buf[i][j] = grid[i][j] ? '-' : '.';

    print_buf[start.X][start.Y] = '*';
    for (int i = 0; i < w; i++) print_buf[H.X][H.Y + i] = 'H';
    for (int i = 0; i < h; i++) print_buf[V.X + i][V.Y] = 'V';

    Point M = meeting_point(H, V);
    print_buf[M.X][M.Y] = 'M';

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << print_buf[i][j];
        cout << '\n';
    }
    cout << '\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> m >> n >> w >> h;
    
    Point H, V;
    {
        int x, y; 
        
        cin >> x >> y;
        H = {y, x};
        cin >> x >> y;
        V = {y, x};
    }


    for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) {
        char c; cin >> c;
        grid[i][j] = c == 'X';
        if (c == '*') start = {i, j};
    }

    // print(H, V);

    assert(valid(H) && valid(V));

    using State = pair<Point, Point>;
    queue<State> q;
    set<State> vis;
    q.push({H, V});
    vis.insert({H, V});

    while (!q.empty()) {
        auto [H, V] = q.front();
        q.pop();

        for (int s: {1, -1}) {
            for (int i = 0; i < 4; i++) {
                Point nH = {H.X + (i == 0) * s, H.Y + (i == 1) * s};
                Point nV = {V.X + (i == 2) * s, V.Y + (i == 3) * s};

                if (valid(nH, nV)) {
                    
                    auto M = meeting_point(nH, nV);
                    if (M == start) {
                        cout << "YES\n"; 
                        return 0;
                    }

                    if (vis.count({nH, nV})) continue;
                    q.push({nH, nV});
                    vis.insert({nH, nV});
                }
            }
        }
    }

    cout << "NO\n";

    

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...