码迷,mamicode.com
首页 > 其他好文 > 详细

poj3279 Fliptile

时间:2017-10-02 18:25:33      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:main   cout   false   bsp   方法   using   space   str   imp   

思路:

枚举。

枚举了第一行的操作之后,下面每行的操作也随之确定了。因为在确定了第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

标签:main   cout   false   bsp   方法   using   space   str   imp   

原文地址:http://www.cnblogs.com/wangyiming/p/7620484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!