这道题的确比较难想,首先我们知道图比较小,有可能是枚举,那么该如何枚举呢???

你可以发现,我们只要把第一排定了,并且保证第一排不准动,那么答案就定了

也就是说,我们首先用二进制枚举,枚举第一行需要翻转的,然后让第一行不准再翻转,后面的翻转只能在第二行进行,那么第二翻转的实际上是定好了的,然后因为定好了,所以不能翻转,那么第二行也定了,我们要改变第二行,只能通过第三行,最后判断一下最后一位是不是0就好了,做法的话,可以把每一行用一个数字保存,然后进行异或操作,对某位的1或者0进行操作,或者笨一点开二维数组。

#include <bits/stdc++.h>
using namespace std;
char str[][];
const int INF = 0x3f3f3f3f;
int main(){
int t;
scanf("%d",&t);
char s[][];
int a[];
while(t--){
memset(a,,sizeof(a));
for (int i=;i<;i++){
scanf("%s",s[i]);
int ss=;
for (int j=;j<;j++){
if (s[i][j]==''){
a[i]+=ss;
}
ss=ss/;
}
}
int b[];
int ans=INF;
for (int i=;i<(<<)-;i++){
for (int j=;j<;j++){
b[j]=a[j];
}
int cnt=;
for (int j=;j<;j++){
if((i>>j)&){
cnt++;
b[]=b[]^(<<j);
b[]=b[]^(<<j);
if (j+<){
b[]=b[]^(<<(j+));
}
if (j->=){
b[]=b[]^(<<(j-));
}
}
}
for (int j=;j<;j++){
for (int k=;k<;k++){
if((b[j-]>>k)&){
b[j-]=b[j-]^(<<k);
b[j]=b[j]^(<<k);
cnt++;
if (k+<){
b[j]=b[j]^(<<(k+));
}
if (k->=){
b[j]=b[j]^(<<(k-));
}
if (j+<){
b[j+]=b[j+]^(<<(k));
}
}
}
}
int flag=;
for (int j=;j<;j++){
if (b[j]!=){
flag=;
break;
}
}
if (flag==){
ans=min(ans,cnt);
}
}
if (ans<=){
printf("%d\n",ans);
}else {
printf("-1\n");
}
}
return ;
}

AcWing95. 费解的开关 枚举+位运算的更多相关文章

  1. [poj]开关类问题 枚举 位运算

    poj 1222  EXTENDED LIGHTS OUT 开关只有两种方案 按和不按,按两次相当于关 只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的. 最后 ...

  2. POJ 2436 二进制枚举+位运算

    题意:给出n头牛的得病的种类情况,一共有m种病,要求找出最多有K种病的牛的数目: 思路:二进制枚举(得病处为1,否则为0,比如得了2 1两种病,代号就是011(十进制就是3)),首先枚举出1的个数等于 ...

  3. c#枚举位运算操作

    抛出预设问题 需要有一个npc需要在一周中的,周一,周二,周三会出现,其他时间不可见 解决问题 因为一周时间是固定的,所以创建枚举类型比较合适,如下 enum Days { None, Sunday, ...

  4. CH0201 费解的开关 枚举

    正解:枚举 解题报告: 入门傻逼题,思维难度不高代码量极小,非常适合上手 然后傻逼的我第二次看这道题的时候依然没想到解法:D 没有办法,就想着写个笔记好歹记录一下以后多复习几次就记着了趴qwq 就是, ...

  5. 深入V8引擎-枚举+位运算实现参数配置

    不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持.为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白. 基本上从初始化引擎,到Isolate.handleScope ...

  6. BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...

  7. 【ACwing 95】费解的开关——枚举 + 搜索

    (题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的 ...

  8. ACWing95. 费解的开关

    题解 这道题目有三个状态条件值得考虑: 每一个开关被按0次或者1次才有意义,如果超过1次,那么等同于按0或1次. 最终的结果与按的顺序无关 因为2,所以可以人为地规定比较合理的顺序. 现在以每一行为顺 ...

  9. POJ 1753 bfs+位运算

    T_T ++运算符和+1不一样.(i+1)%4 忘带小括号了.bfs函数是bool 型,忘记返回false时的情况了.噢....debug快哭了...... DESCRIPTION:求最少的步骤.使得 ...

随机推荐

  1. stream的map用法

    List<String> list = new ArrayList<>();list.add("1");list.add("2");li ...

  2. [转]Event loop——浏览器和Node区别

    最近对Event loop比较感兴趣,所以了解了一下.但是发现整个Event loop尽管有很多篇文章,但是没有一篇可以看完就对它所有内容都了解的文章.大部分的文章都只阐述了浏览器或者Node二者之一 ...

  3. mit课程ocw-mathematics

    https://ocw.mit.edu/courses/find-by-topic/#cat=mathematics Course # Course Title Level 1.010 Uncerta ...

  4. Javaweb Form表单查询

    1.表单(form),是一种可以由用户输入,并提交给服务器端的一个图形界面,有如下性质: (1)表单中可以输入一些内容,这些输入功能由控件提供,叫做表单元素 (2)表单中一般都有一个按钮负责提交 (3 ...

  5. day 53

    目录 orm表关系如何建立 django中间件 路由层 反向解析 路由分发 名称空间 伪静态 虚拟环境 django版本的区别 视图层 orm表关系如何建立 ​ 多对多 ​ 一对多 ​ 一对一 ​ 换 ...

  6. Hibernate_条件查询客户列表

    分析:通过名称查询 实现: 1.在list.jsp中修改 2.修改ListCustomerServlet 首先获取cust_name,增加条件:若不为空,则模糊搜索,再调用Service方法,结果放到 ...

  7. js实现使用递归来计算1~任意数字的和

    function getSum(n){ if(n==1){ return 1; } return n+getSum(n-1); } var res = getSum(100); console.log ...

  8. linux源码安装

    以安装xxx.tar.gz为例: 源码存放位置:/usr/local/src/ 安装路径:/usr/local/xxx/ 配置文件存放位置:/usr/local/xxx/etc/ 可执行文件存放位置: ...

  9. C++中的 istringstream 的用法

    C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含<sstream>这个头文件. istringstream ...

  10. 第八章—BOM(一)

    ECMAscript是JS的核心,而要在web上使用JS,那么BOM无疑是真正的核心.BOM叫浏览器对象模型,它提供了许多对象,用于访问浏览器的功能. BOM的核心对象是window,它表示浏览器的一 ...