mayoko’s diary

プロコンとかいろいろ。

Codeforces Round #300 D. Weird Chess

Codeforces Round #300に参加。結果はBCD通しただけであんまりよくない。一応レート上がったけど。
戦略としてはあとEかFのどっちかも解くつもりだったけどDで時間食いすぎて間に合わなかった。

問題:Problem - 538D - Codeforces

解法:よく似た問題がこちら。->http://yukicoder.me/problems/454
これと同じようにずれ(dx, dy)について全探索して条件に合うのを答えに追加していけばよい。
なんでこれに気づくのにあんなに時間かかったんだ…

以下ソースコード

const int MAXN = 55;
string board[MAXN];

struct Point {
    int y;
    int x;
    Point(int y, int x) : y(y), x(x) {}
    Point() {}
    bool operator<(const Point& rhs) const {
        if (y != rhs.y) return y < rhs.y;
        else return x < rhs.x;
    }
};

vector<Point> piece;
vector<Point> ans;

char ANS[2*MAXN][2*MAXN];
int N;

bool ok(int dy, int dx) {
    int n = piece.size();
    for (int i = 0; i < n; i++) {
        int nx = piece[i].x+dx;
        int ny = piece[i].y+dy;
        if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
        if (board[ny][nx] == '.') return false;
    }
    for (int i = 0; i < n; i++) {
        int nx = piece[i].x+dx;
        int ny = piece[i].y+dy;
        if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
        board[ny][nx] = '?';
    }
    return true;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> board[i];
        for (int j = 0; j < N; j++) {
            if (board[i][j] == 'o') piece.push_back(Point(i, j));
        }
    }
    sort(piece.begin(), piece.end());
    for (int dx = -N+1; dx < N; dx++) {
        for (int dy = -N+1; dy < N; dy++) {
            if (dy == 0 && dx == 0) continue;
            if (ok(dy, dx)) ans.push_back(Point(dy, dx));
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (board[i][j] == 'x') {
                cout << "NO" << endl;
                return 0;
            }
        }
    }
    cout << "YES" << endl;
    for (int i = 0; i < 2*N-1; i++) {
        for (int j = 0; j < 2*N-1; j++) {
            ANS[i][j] = '.';
        }
    }
    ANS[N-1][N-1] = 'o';
    for (auto p : ans) {
        ANS[N-1+p.y][N-1+p.x] = 'x';
    }
    for (int i = 0; i < 2*N-1; i++) {
        for (int j = 0; j < 2*N-1; j++) {
            cout << ANS[i][j] ;
        }
        cout << endl;
    }
    return 0;
}