poj3279 Fliptile
Posted 王宜鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3279 Fliptile相关的知识,希望对你有一定的参考价值。
思路:
枚举。
枚举了第一行的操作之后,下面每行的操作也随之确定了。因为在确定了第i行的操作之后,要想再改变a[i][j]的状态只能通过改变a[i + 1][j]来实现。另外,用到了集合的整数表示方法。
实现:
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int INF = 0x3f3f3f3f; 5 const int dx[4] = {0, 1, 0, -1}; 6 const int dy[4] = {1, 0, -1, 0}; 7 int a[20][20], b[20][20], ans[20][20], buf[20][20], m, n; 8 void turn(int x, int y) 9 { 10 b[x][y] = 1 - b[x][y]; 11 for (int i = 0; i < 4; i++) 12 { 13 int nx = x + dx[i], ny = y + dy[i]; 14 if (nx >= 0 && nx < m && ny >= 0 && ny < n) 15 { 16 b[nx][ny] = 1 - b[nx][ny]; 17 } 18 } 19 } 20 int main() 21 { 22 cin >> m >> n; 23 for (int i = 0; i < m; i++) 24 { 25 for (int j = 0; j < n; j++) 26 cin >> a[i][j]; 27 } 28 int minn = INF; 29 for (int i = 0; i < (1 << n); i++) 30 { 31 int cnt = 0; 32 memset(buf, 0, sizeof buf); 33 for (int i = 0; i < m; i++) 34 { 35 for (int j = 0; j < n; j++) 36 { 37 b[i][j] = a[i][j]; 38 } 39 } 40 for (int j = 0; j < n; j++) 41 { 42 int msk = 1 << j; 43 if (i & msk) 44 { 45 turn(0, j); cnt++; buf[0][j] = 1; 46 } 47 } 48 for (int j = 1; j < m; j++) 49 { 50 for (int k = 0; k < n; k++) 51 { 52 if (b[j - 1][k]) 53 { 54 turn(j, k); cnt++; buf[j][k] = 1; 55 } 56 } 57 } 58 bool flg = true; 59 for (int i = 0; i < n; i++) 60 { 61 if (b[m - 1][i]) { flg = false; break; } 62 } 63 if (flg && cnt < minn) 64 { 65 minn = cnt; 66 for (int i = 0; i < m; i++) 67 { 68 for (int j = 0; j < n; j++) 69 { 70 ans[i][j] = buf[i][j]; 71 } 72 } 73 } 74 } 75 if (minn == INF) cout << "IMPOSSIBLE" << endl; 76 else 77 { 78 for (int i = 0; i < m; i++) 79 { 80 for (int j = 0; j < n; j++) 81 cout << ans[i][j] << " "; 82 cout << endl; 83 } 84 } 85 return 0; 86 }
以上是关于poj3279 Fliptile的主要内容,如果未能解决你的问题,请参考以下文章