|
| 1 | +#include <iostream> |
| 2 | +#include <vector> |
| 3 | +#include <string> |
| 4 | + |
| 5 | +using namespace std; |
| 6 | + |
| 7 | +int N, M; |
| 8 | + |
| 9 | +void reverse(vector<vector<int>> &m, int r, int c, int dr, int dc) { |
| 10 | + while (r < N && c < M) { |
| 11 | + m[r][c] = !m[r][c]; |
| 12 | + r += dr; c += dc; |
| 13 | + } |
| 14 | +} |
| 15 | + |
| 16 | +bool equal(vector<vector<int>> &a, vector<vector<int>> &b) { |
| 17 | + for (int i = 0; i < N; i++) |
| 18 | + for (int j = 0; j < M; j++) |
| 19 | + if (a[i][j] != b[i][j]) return false; |
| 20 | + return true; |
| 21 | +} |
| 22 | + |
| 23 | +void search(vector<vector<int>> m, vector<vector<int>> &target, int &answer, bool dr, bool dc, bool eq) { |
| 24 | + int n = 0, r = 0, c = 0; |
| 25 | + do if (( eq && (m[r][c] != target[r][c])) || |
| 26 | + (!eq && (m[r][c] == target[r][c]))) { |
| 27 | + n++; |
| 28 | + reverse(m, r, c, !dr, !dc); |
| 29 | + } while ((r += dr) < N && (c += dc) < M); |
| 30 | + |
| 31 | + r = 0, c = 0; |
| 32 | + do if (m[r][c] != target[r][c]) { |
| 33 | + n++; |
| 34 | + reverse(m, r, c, dr, dc); |
| 35 | + } while ((r += !dr) < N && (c += !dc) < M); |
| 36 | + |
| 37 | + if (equal(m, target) && (answer < 0 || answer > n)) { |
| 38 | + answer = n; |
| 39 | + } |
| 40 | +} |
| 41 | + |
| 42 | +int solution(vector<vector<int>> beginning, vector<vector<int>> target) { |
| 43 | + int answer = -1, n = 0; |
| 44 | + N = beginning.size(); M = beginning[0].size(); |
| 45 | + search(beginning, target, answer, 0, 1, true); |
| 46 | + search(beginning, target, answer, 1, 0, true); |
| 47 | + search(beginning, target, answer, 0, 1, false); |
| 48 | + search(beginning, target, answer, 1, 0, false); |
| 49 | + return answer; |
| 50 | +} |
0 commit comments