poj2965 The Pilots Brothers' refrigerator 枚举或DFS

news/2024/7/4 14:21:31

http://poj.org/problem?id=2965

一、枚举每一个‘+’点,对该点和该点所在的同一行和同一列所有点进行操作,开关本身状态改变了7次,开关同一行、同一列的开关状态改变了4次,其他开关状态改变了2次。

然后,用一个数组存取每个操作,如果为奇数,则证明该点为必须点,否则为不必要的。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 char map[4][4];
 5 int ans[4][4];
 6 char as(char g)
 7 {
 8     if(g=='+')
 9     return '-';
10     return '+';
11 }
12 void qw(int n,int m)
13 {
14     for(int i=0;i<4;i++)
15     {
16         map[n][i]=as(map[n][i]);
17     }
18     for(int j=0;j<4;j++)
19     {
20         if(j!=n)
21         map[j][m]=as(map[j][m]);
22     }
23     ans[n][m]++;
24 }
25 void ac()
26 {
27     for(int i=0;i<4;i++)
28     {
29         for(int j=0;j<4;j++)
30         {
31             if(map[i][j]=='+')
32             {
33                 for(int t=0;t<4;t++)
34                 {
35                     qw(i,t);
36                 }
37                 for(int t=0;t<4;t++)
38                 {
39                     if(t!=i)
40                     qw(t,j);
41                 }
42             }
43         }
44     }
45 }
46 main()
47 {
48     int i,j,cas=0;
49     for(i=0;i<4;i++)
50     scanf("%s",map[i]);
51     memset(ans,0,sizeof(ans));
52     ac();
53     for(i=0;i<4;i++)
54     {
55         for(j=0;j<4;j++)
56         {
57             if(ans[i][j]%2==1)
58             cas++;
59         }
60     }
61     printf("%d\n",cas);
62     for(i=0;i<4;i++)
63     {
64         for(j=0;j<4;j++)
65         {
66             if(ans[i][j]%2==1)
67             printf("%d %d\n",i+1,j+1);
68         }
69     }
70 }
View Code

 一种高效算法,这种算法只对n为偶数时适用。

 1 #include<iostream>
 2 #include<memory.h>
 3 using namespace std;
 4 #define INF 0x7fffffff
 5 int p[5][5];
 6 int main(void)
 7 {
 8     char c;
 9     memset(p, 0, sizeof(p));
10     for (int i = 1; i <= 4; i++)
11         for (int j = 1; j <= 4; j++)
12         {
13             cin >> c;
14             if (c == '+')
15             {
16                 for (int k = 1; k <= 4; k++)
17                 {
18                     p[i][k]++;
19                     p[k][j]++;
20                 }
21                 p[i][j]--;
22             }
23         }
24     int sum = 0;
25     for (int i = 1; i <= 4; i++)
26         for (int j = 1; j <= 4; j++)
27             sum += p[i][j]%2;
28     cout << sum << endl;
29     for (int i = 1; i <= 4; i++)
30         for (int j = 1; j <= 4; j++)
31             if  (p[i][j]%2)
32                 cout << i << " " << j << endl;
33 //    system("pause");
34     return 0;
35 }
View Code
 

DFS版

  1 #include <iostream>
  2 
  3 #include <cstdio>
  4 
  5 #include <cstring>
  6 
  7 #include <cstdlib>
  8 
  9 using namespace std;
 10 
 11  
 12 
 13 bool map[4][4];
 14 
 15 int ans[16];
 16 
 17  
 18 
 19 void init()
 20 
 21 {
 22 
 23     int i, j;
 24 
 25  
 26 
 27     for (i = 0; i < 4; i++)
 28 
 29     {
 30 
 31         for (j = 0; j < 4; j++)
 32 
 33         {
 34 
 35             char ch;
 36 
 37             cin >> ch;
 38 
 39             if (ch == '-')
 40 
 41                 map[i][j] = true;
 42 
 43             else
 44 
 45                 map[i][j] = false;
 46 
 47         }
 48 
 49         getchar();
 50 
 51     }
 52 
 53 }
 54 
 55  
 56 
 57 void operate(int x, int y)
 58 
 59 {
 60 
 61     if (x < 0 || y < 0 || x > 3 || y > 3)
 62 
 63         return;
 64 
 65     map[x][y] = !map[x][y];
 66 
 67 }
 68 
 69  
 70 
 71 void turn(int pos)
 72 
 73 {
 74 
 75     ans[pos] = !ans[pos];
 76 
 77     int x = pos / 4;
 78 
 79     int y = pos % 4;
 80 
 81     int i;
 82 
 83     operate(x, y);
 84 
 85     for (i = 1; i < 4; i++)
 86 
 87     {
 88 
 89         operate(x + i, y);
 90 
 91         operate(x, y + i);
 92 
 93         operate(x - i, y);
 94 
 95         operate(x, y - i);
 96 
 97     }
 98 
 99 }
100 
101  
102 
103 bool finished()
104 
105 {
106 
107     int tot = 0;
108 
109     int i;
110 
111     for (i = 0; i < 16; i++)
112 
113         tot += map[i / 4][i % 4];
114 
115     return (tot == 16);
116 
117 }
118 
119  
120 
121 void output()
122 
123 {
124 
125     int i;
126 
127     for (i = 0; i < 16; i++)
128 
129     {
130 
131         if (ans[i])
132 
133             printf("%d %d\n", i / 4 + 1, i % 4 + 1);
134 
135     }
136 
137 }
138 
139  
140 
141 void dfs(int pos, int step)
142 
143 {
144 
145     if (finished())
146 
147     {
148 
149         cout << step << endl;
150 
151         output();
152 
153 
154         return;
155 
156     }
157 
158     if (pos >= 16)
159 
160         return;
161 
162     dfs(pos + 1, step);
163 
164     turn(pos);
165 
166     dfs(pos + 1, step + 1);
167 
168     turn(pos);
169 
170 }
171 
172  
173 
174 int main()
175 
176 {
177 
178 
179     init();
180 
181     dfs(0, 0);
182 
183  
184 
185     return 0;
186 
187 }
View Code

 

转载于:https://www.cnblogs.com/CrazyBaby/p/5506530.html


http://www.niftyadmin.cn/n/3376025.html

相关文章

webpack踩坑之路——构建基本的React+ES6项目

webpack是最近比较火的构建工具&#xff0c;搭配上同样比较火的ReacJS与ES6(ES2015)一定是现在很多潮流 programmer 的追求。 废话不多&#xff0c;下面就就看下如何从0搭起我们的构建工具。 安装 全局安装webpack&#xff0c;如果安装后还是提示没有webpack commond&#xff0…

集合类与容器

1.集合类是放在java.util.*&#xff1b;这个包里。集合类存放的都是对象的引用&#xff0c;而非对象本身&#xff0c;为了说起来方便些&#xff0c;我们称集合中的对象就是指集合中对象的引用&#xff08;reference)。引用的概念大家不会忘了吧&#xff0c;在前边我们讲数据类型…

Skyline中使用AxTE3DWindowEx打开新的一个球体

在winform窗体中拖入AxTE3DWindowEx控件。 using system; using system.Collections.Generic; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using TerraExplorerX;namespace golbeEx{public partical class …

Linux下单台Redis集群搭建

一、本文目标 要在单台机器上搭建Redis集群&#xff0c;方式是通过不同的TCP端口启动多个实例&#xff0c;然后组成集群&#xff0c;同时记录在搭建过程中踩过的坑。 二、安装准备 centos版本&#xff1a;6.7 redis版本&#xff1a;3.2.3 安装方式&#xff1a;源码安装 服务器&…

iOS基于MVC的项目重构总结

关于MVC的争论 关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你认为的MVC的问题,一定是你自己理解的问题(资深架构师请自动忽略本文). 行文过程中查阅了互联网上的大量文档,其中水平良莠不齐(最常见的就是MVC改个名就当MVVM的…

日常菜谱-1

菜单&#xff1a;小炒肉、可乐鸡翅、红烧豆腐、炒青菜、番茄蛋汤。详情&#xff1a;1、猪肉、红辣椒、绿辣椒、生姜、料酒。2、鸡中翅、可口可乐、红辣椒、八角、大蒜、香葱。3、嫩豆腐、酱油、葱。4、小青菜、猪油渣&#xff08;肥肉&#xff09;、大蒜、红辣椒。5、番茄、鸡蛋…

acpi参考网站

1、acpi官网&#xff1a; http://www.acpi.info/ 转载于:https://www.cnblogs.com/dirt2/p/5964191.html

Ansible安装配置Nginx

一、思路 现在一台机器上编译安装好nginx、打包&#xff0c;然后在用ansible去下发 cd /etc/ansible 进入ansible配置文件目录 mkdir roles/{common,install}/{handlers,files,meta,tasks,templates,vars} –pv 目录说明&#xff1a; roles目录下面有两个角色&#xff0c;commo…