Fliptile || 暴力模拟

呃呃USACO真的是除了John就是Cow....
就就是很像之前一个做过的题的翻版忘记叫啥名字了,基本一模一样,这次基本做出来了但是忘了枚举第一行的意义:其实就是如果第一行固定了的话答案其实也就固定了,所以只需要枚举第一行所有的次数,接着根据上一行推下一行就完事了,需要额外记一个答案数组,我的评价是怎么暴力怎么来就好了。。。
代码 :
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 #include <algorithm> 5 //#include <array> 6 #define gogo ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); 7 using namespace std; 8 //using i64 = long long; 9 //#define endl '\n'; 10 const string YES = "Yes"; 11 const string NO = "No"; 12 13 const int N = 20; 14 int m, n; 15 int g[N][N], backup[N][N]; 16 int cnt[N][N], ans[N][N]; 17 int dx[5] = {1, 0, -1, 0, 0}, dy[5] = {0, 1, 0, -1, 0}; 18 19 void change(int x, int y) { 20 cnt[x][y] ++; 21 for (int i = 0;i < 5;i ++) { 22 int a = x + dx[i], b = y + dy[i]; 23 if (a < 0 || a >= n || b < 0 || b >= m) 24 continue; 25 g[a][b] ^= 1; 26 } 27 } 28 29 int main() { 30 gogo; 31 32 cin >> n >> m; 33 int res = 0x3f3f3f3f; 34 for (int i = 0;i < n;i ++) 35 for (int j = 0;j < m;j ++) 36 cin >> g[i][j]; 37 38 memcpy(backup, g, sizeof g); 39 for (int t = 0;t < (1 << m);t ++) { 40 //initialize 41 memset(cnt, 0, sizeof cnt); 42 memcpy(g, backup, sizeof g); 43 int step = 0; 44 45 //first line 46 for (int i = 0;i < m;i ++) 47 if (t >> i & 1) { 48 step ++; 49 change(0, i); 50 } 51 //left 52 for (int i = 1;i < n;i ++) 53 for (int j = 0;j < m;j ++) 54 if (g[i - 1][j]) { 55 step ++; 56 change(i, j); 57 } 58 59 //check 60 bool ok = false; 61 for (int i = 0;i < n;i ++) 62 for (int j = 0;j < m;j ++) 63 if (g[i][j]) { 64 ok = true; 65 break; 66 } 67 //record 68 if (!ok) { 69 if (step < res) { 70 res = step; 71 memcpy(ans, cnt, sizeof cnt); 72 } 73 } 74 } 75 if (res != 0x3f3f3f3f) { 76 //cout << res << '\n'; 77 for (int i = 0;i < n;i ++) { 78 for (int j = 0;j < m;j ++) 79 cout << ans[i][j] << ' '; 80 cout << '\n'; 81 } 82 } 83 else 84 cout << "IMPOSSIBLE" << '\n'; 85 }

浙公网安备 33010602011771号