Loading

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 }
View Code

 

posted @ 2023-02-18 22:38  KakaDBL  阅读(19)  评论(0)    收藏  举报