1
+ // The main algorithm in this problem is Breadth First Search.
2
+ class Solution {
3
+ private:
4
+ bool valid (int n, int m, int x, int y) {
5
+ return (0 <= x && x < n) && (0 <= y && y < m);
6
+ }
7
+
8
+ string convert (vector<vector<int >> &c, int n, int m) {
9
+ string s;
10
+
11
+ for (int i = 0 ; i < n; ++i) {
12
+ for (int j = 0 ; j < m; ++j) {
13
+ s += c[i][j] + ' 0' ;
14
+ }
15
+ }
16
+
17
+ return s;
18
+ }
19
+
20
+ int get (string s, int i, int j, int n, int m) {
21
+ return s[i * m + j] - ' 0' ;
22
+ }
23
+
24
+ void set (string &s, int i, int j, int val, int n, int m) {
25
+ s[i * m + j] = val + ' 0' ;
26
+ }
27
+
28
+ public:
29
+ int minFlips (vector<vector<int >>& c) {
30
+ int n = c.size ();
31
+ int m = c[0 ].size ();
32
+
33
+ map<string, int > dp;
34
+ map<string, bool > used;
35
+
36
+ vector<int > dx = {-1 , 0 , 1 , 0 };
37
+ vector<int > dy = {0 , 1 , 0 , -1 };
38
+
39
+ string cToNum = convert (c, n, m);
40
+ string zero (n * m, ' 0' );
41
+
42
+ if (cToNum == zero) {
43
+ return 0 ;
44
+ }
45
+
46
+ queue<string> q;
47
+ q.push (cToNum);
48
+
49
+ dp[cToNum] = 0 ;
50
+
51
+ while (!q.empty ()) {
52
+ string a = q.front ();
53
+ q.pop ();
54
+
55
+ used[a] = true ;
56
+
57
+ for (int i = 0 ; i < n; ++i) {
58
+ for (int j = 0 ; j < m; ++j) {
59
+ string b = a;
60
+
61
+ set (b, i, j, 1 - get (b, i, j, n, m), n, m);
62
+
63
+ for (int k = 0 ; k < 4 ; ++k) {
64
+ int x = i + dx[k];
65
+ int y = j + dy[k];
66
+
67
+ if (valid (n, m, x, y)) {
68
+ set (b, x, y, 1 - get (b, x, y, n, m), n, m);
69
+ }
70
+ }
71
+
72
+ if (!used[b]) {
73
+ q.push (b);
74
+ dp[b] = dp[a] + 1 ;
75
+
76
+ if (b == zero) {
77
+ return dp[b];
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ return -1 ;
85
+ }
86
+ };
0 commit comments