题目链接:

https://vjudge.net/problem/POJ-2965

题目大意:

一个冰箱上有4*4共16个开关,改变任意一个开关的状态(即开变成关,关变成开)时,此开关的同一行、同一列所有的开关都会自动改变状态。要想打开冰箱,要所有开关全部打开才行。

思路:

一开始以为是和POJ1753一样的套路,直接枚举,结果TLE(无语)。后来百度之后发现都是这样,不能直接枚举

首先要明白最基本的原理:对一个开关进行操作n次,如果n为偶数,那么这个开关以及同行、同列的开关状态都不发生改变,等价于没有操作;如果n为奇数,那么这个开关以及同行同列的开关状态全都发生改变,等价于只操作了一次。

要想使所有开关状态全部打开(全部是-),就要把所有+变成-,所有-不改变。我们要做的就是找到一种“公式”,策略,使得不改变已经打开的开关状态的情况下,把关闭的开关打开。这点很类似于魔方(PS:玩过魔方的都知道,魔方所谓的公式,其实就是在不改变已经拼好的部分的情况下,把其他部分一点一点添加到已拼好的部分)。

我们找到的策略就是:把开关本身以及其同一行同一列的开关(总共7个)都进行一次操作,结果是,开关本身状态改变了7次,开关同一行、同一列的开关状态改变了4次,其他开关状态改变了2次。如下图所示。

假如开关坐标为第二行第三列的(2,3),那么按照上述策略(把开关本身以及其同一行同一列的开关都进行一次操作),结果分析如下:

对于黄色部分的开关,只有与此黄色开关同一行和同一列的两个红色开关操作时,此黄色开关的状态才会发生改变,因此所有黄色部分状态改变次数为2,相当于0次

对于红色部分的开关,只有与此红色开关同一列或同一列的开关操作时,此红色开关状态才会发生改变,一行或者一列有4个开关,因此红色部分开关状态改变次数为4,相当于0次

对于最原始的那个黑色开关,所有红色开关操作时,它的状态改变一次,然后黑色开关自己操作一次,因此黑色开关状态改变7次,相当于改变1次。

总结上述分析可以得出结论,把开关本身以及其同一行同一列的开关都进行一次操作,最终结果是只有开关本身状态发生变化,其他所有开关状态都不变。

策略找到之后,那我们就想,如果对于所有关闭着的开关都进行一次上述策略,那么肯定是能把冰箱打开的,下面我们要做的就是把一些无用的,重复的操作去掉即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + ;
const int INF = << ;
int T, n, m;
bool a[][], b[][], v[][];
int dir[][] = {,,,,-,,,-};
int main()
{
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
char c = getchar();
if(c == '+')
{
a[i][j] = !a[i][j];
for(int k = ; k < ; k++)
{
a[i][k] = !a[i][k];
a[k][j] = !a[k][j];
}
}
}
getchar();
}
int tot = ;
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
if(a[i][j])tot++;
}
}
cout<<tot<<endl;
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
if(a[i][j])cout<<(i + )<<" "<<(j + )<<endl;
}
}
return ;
}

POJ-2965 The Pilots Brothers' refrigerator---思维题的更多相关文章

  1. 枚举 POJ 2965 The Pilots Brothers' refrigerator

    题目地址:http://poj.org/problem?id=2965 /* 题意:4*4的矩形,改变任意点,把所有'+'变成'-',,每一次同行同列的都会反转,求最小步数,并打印方案 DFS:把'+ ...

  2. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  3. POJ 2965 The Pilots Brothers' refrigerator 位运算枚举

      The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 151 ...

  4. poj 2965 The Pilots Brothers' refrigerator (dfs)

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17450 ...

  5. POJ 2965 The Pilots Brothers' refrigerator 暴力 难度:1

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16868 ...

  6. POJ 2965 The Pilots Brothers' refrigerator (DFS)

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15136 ...

  7. POJ - 2965 The Pilots Brothers' refrigerator(压位+bfs)

    The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to op ...

  8. poj 2965 The Pilots Brothers' refrigerator枚举(bfs+位运算)

    //题目:http://poj.org/problem?id=2965//题意:电冰箱有16个把手,每个把手两种状态(开‘-’或关‘+’),只有在所有把手都打开时,门才开,输入数据是个4*4的矩阵,因 ...

  9. POJ 2965 The Pilots Brothers' refrigerator【枚举+dfs】

    题目:http://poj.org/problem?id=2965 来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26732#pro ...

  10. POJ 2965 The Pilots Brothers' refrigerator (枚举+BFS+位压缩运算)

    http://poj.org/problem?id=2965 题意: 一个4*4的矩形,有'+'和'-'两种符号,每次可以转换一个坐标的符号,同时该列和该行上的其他符号也要随之改变.最少需要几次才能全 ...

随机推荐

  1. java反射机制(先马再看)

    http://blog.csdn.net/sinat_38259539/article/details/71799078

  2. nodejs加密Crypto简单例子

    加密技术通常分为两大类:“对称式”和“非对称式”. 对称式加密: 就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是 ...

  3. MYSQL数据库学习八 触发器的操作

    8.1 触发器 在表发生更改时,自动进行一些处理.例如,学生表中每增加一条关于学生记录时,学生的总数就必须同时改变,同时需要检查电话号码格式是否正确,地址缩写是否正确. 以下语句会激活触发器: DEL ...

  4. 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面

    一.创建脚本工具并执行初始迁移 在本节中,您将使用包管理控制台(PMC)来更新数据库: •添加VisualStudio Web代码生成包.这个包是运行脚本引擎所必需的. • 执行Add-Migrati ...

  5. RabbitMQ 消息确认与公平调度消费者

    一.消息确认 为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将该消息删除,如果消费者超时不回馈,那么服务器将就将该消息重新 ...

  6. [poj3252]Round Numbers_数位dp

    Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...

  7. 获取服务器时间js代码

    function getSevertime(){ var xmlHttp = new XMLHttpRequest(); if( !xmlHttp ){ xmlHttp = new ActiveXOb ...

  8. JavaScript(第二十四天)【事件对象】

    JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的 ...

  9. c语言第一次作业——输入与输出格式

    一.PTA实验作业 1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 ...

  10. C语言最后一次博客作业

    1.当初你是如何做出选择计算机专业的决定的? 一开始选专业的时候,说实话我很纠结也很迷茫,对我来说,中学时代,似乎就只要考好试,做好题就可以了,对于未来想要做啥并没有那么多的规划和想法,偶尔跟基友畅聊 ...