mayoko’s diary

プロコンとかいろいろ。

SRM 530 div1 easy: GogoXCake

解法

切り取られていなければならない部分を左上から探索します。

class GogoXCake {
public:
    string solve(vector <string> cake, vector <string> cutter) {
        int H = cake.size(), W = cake[0].size();
        int n = cutter.size(), m = cutter[0].size();
        int first = 0;
        for (; ; first++) if (cutter[0][first] == '.') break;
        for (int h = 0; h < H; h++) for (int w = 0; w < W; w++) {
            if (cake[h][w] == '.') {
                if (w < first) return "NO";
                if (w+m-first > W) return "NO";
                if (h+n > H) return "NO";
                for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) {
                    int y = h+i, x = w+j-first;
                    if (cutter[i][j] == '.') {
                        if (cake[y][x] == 'X') return "NO";
                        cake[y][x] = 'X';
                    }
                }
            }
        }
        for (int h = 0; h < H; h++) for (int w = 0; w < W; w++) if (cake[h][w] == '.') return "NO";
        return "YES";
    }
};