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; }