ACAG 0x02-4 费解的开关

对于这道题,我们不难发现如下性质:

  1. 每个位置之多被点击一次;
  2. 点击的先后顺序不影响结果;
  3. 若确定了第$1$行,则接下来可能的点击方案就只有$1$种。具体原因是:当第$i$行某一位为$0$时,此时前$i$行均已确定,所以只能点击第$i+1$行该位置上的数,才能使第$i$行的这一位变成$1$。

    于是,我们只需要考虑第一行的点击方法。不难枚举得,共$32$种。我们可以用$0$~$31$的二进制表示点击方法。

    然后,对于每种方法,我们可以递推出接下来$2$~$5$行的点击方法,最后进行检查。如果矩阵全变为$1$,则说明该方案合法。并更新答案。

    此外,在检查的时候,只需要检查最后$1$行即可。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f using namespace std; int n,ans,tmp;
int a[7][7],b[7][7];
char s[7]; void Read() {
for(int i=1;i<=5;i++) {
cin>>(s+1);
for(int j=1;j<=5;j++) {
a[i][j]=s[j]-'0';
}
}
ans=INF;
return;
} void Init() {
for(int i=1;i<=5;i++) {
for(int j=1;j<=5;j++) {
b[i][j]=a[i][j];
}
}
tmp=0;
return;
} void Change(int x,int y) {
b[x][y]==1?b[x][y]=0:b[x][y]=1;
b[x][y-1]==1?b[x][y-1]=0:b[x][y-1]=1;
b[x][y+1]==1?b[x][y+1]=0:b[x][y+1]=1;
b[x-1][y]==1?b[x-1][y]=0:b[x-1][y]=1;
b[x+1][y]==1?b[x+1][y]=0:b[x+1][y]=1;
tmp++;
return;
} bool Check() {
if(tmp>6) {
return false;
}
for(int i=1;i<=5;i++) {
if(b[5][i]==0) {
return false;
}
}
return true;
} void DFS(int x) {
if(x==6) {
if(Check()) {
ans=min(ans,tmp);
}
return;
}
for(int i=1;i<=5;i++) {
if(b[x-1][i]==0) {
Change(x,i);
}
}
DFS(x+1);
} void Solve() {
for(int i=0;i<=31;i++) {
Init();
for(int j=0;j<=4;j++) {
int x=(i>>j)&1;
if(x) {
Change(1,j+1);
}
}
DFS(2);
}
printf("%d\n",ans==INF?-1:ans);
return;
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) {
Read();
Solve();
}
return 0;
}

ACAG 0x02-4 费解的开关的更多相关文章

  1. AcWing 95 费解的开关

    目录 前言 题目链接 思路 代码 前言 博客咕咕咕了好久了,是时候写一下了 题目链接 AcWing 95 费解的开关 思路 首先可以看出 1.每一个位置顶多只会操作一次.因为如果操作两次的话,相当于不 ...

  2. TyvjP1266 费解的开关

    P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏 ...

  3. TVYJ1266:费解的开关

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://www.joyoi.cn/problem/tyvj-1266 这 ...

  4. ACWING 95 费解的开关 解题记录

    你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也 ...

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

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

  6. ACWing95. 费解的开关

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

  7. TYVJ1266 费解的开关

    恩,这题...... 看看题面想到了啥?炮兵阵地! 再仔细一思考:炮兵阵地是求放置最多,而这个显然可以递推得出. 由于每个格子至多点一次,那么我们发现: 在第一行点击状态确定的情况下,后面每个格子的点 ...

  8. CH0201 费解的开关 枚举

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

  9. tyvj 1266 费解的开关

    传送门 解题思路 枚举第一行的状态,判断后面可不可行. 代码 #include<iostream> #include<cstdio> #include<cstring&g ...

随机推荐

  1. bootCDN引用的bootstrap前端框架套件和示例

    这是bootCDN上引用的bootstrap前端框架套件,由多个框架组合而成,方便平时学习和测试使用.生产环境要仔细琢磨一下,不要用开发版,而要用生产版.bootCDN的地址是:https://www ...

  2. Centos7时区修改方法汇总

    方法一: timedatectl set-timezone Asia/Shanghai 方法二: 设置环境变量TZ(这个方法用得比较少,但是有一次就是这个方法帮了我大忙,其他都无法实现修改时区,特此记 ...

  3. vue使用px2rem

    配置 flexible 安装 lib-flexible 在命令行中运行如下安装: 1 npm i lib-flexible --save 引入 lib-flexible 在项目入口文件 main.js ...

  4. springboot底层原理简述

    1.maven 子父依赖关系,快速整合第三方框架 2.无配置文件 省略了web.xml,spring.xml,springmvc.xml.mybatis.xml. spring3.0以上提供注解,sp ...

  5. CentOS 5 源

    # The mirror system uses the connecting IP address of the client and the # update status of each mir ...

  6. WSAEventSelect模型

    WSAEventSelect模型 EventSelect WSAEventSelect function The WSAEventSelect function specifies an event ...

  7. JAVA–利用Filter和session防止页面重复提交

    JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览 ...

  8. 嵌入式02 STM32 实验09 独立/窗口看门狗

    一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂 ...

  9. 进程池和线程池、协程、TCP单线程实现并发

    一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...

  10. Python中的sync和wait函数的使用

    转自这篇博文,备忘: https://blog.csdn.net/Likianta/article/details/90123678 https://www.cnblogs.com/xinghun85 ...