行と列を頂点にすると、オイラーパスの問題になる。
連結かどうか調べる必要があるのを最後まで忘れていた。
void dfs(int i, int j, vector<string> &B) { B[i][j] = '.'; for (int k = 0; k < (int)B.size(); ++k) { if (B[k][j] == '#') dfs(k, j, B); } for (int k = 0; k < (int)B[i].size(); ++k) { if (B[i][k] == '#') dfs(i, k, B); } return ; } class MagicBoard { public: string ableToUnlock(vector <string> B) { const int h = B.size(); const int w = B[0].size(); vector<int> R[h]; vector<int> C[w]; for (int i = 0; i < (int)h; ++i) { for (int j = 0; j < (int)w; ++j) { if (B[i][j] == '#') { R[i].push_back(j); C[j].push_back(i); } } } int r, c; r = c = 0; for (int i = 0; i < (int)w; ++i) { c += C[i].size() % 2; } for (int i = 0; i < (int)h; ++i) { r += R[i].size() % 2; } cout << r << ' ' << c << endl; if (r + c == 0 || (r + c == 2 && c)) ; else return "NO"; for (int i = 0; i < (int)h; ++i) { for (int j = 0; j < (int)w; ++j) { if (B[i][j] == '#') { dfs(i, j, B); return count(B.begin(), B.end(), string(w, '.')) == B.size() ? "YES" : "NO"; } } } return "@"; } };