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的主要内容,如果未能解决你的问题,请参考以下文章

[POJ3279]Fliptile(开关问题,枚举)

Fliptile(POJ 3279)

Poj - 3279 Fliptile

poj 3279 Fliptile (简单搜索)

翻转问题 Fliptile POJ - 3279

D - Fliptile POJ - 3279