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. phpspreadsheet 中文文档(二) 结构+自动筛选

    2019年10月11日13:55:41 原理图 自动加载器 PhpSpreadsheet依赖于Composer自动加载器.因此,在独立使用PhpSpreadsheet之前,请确保先运行composer ...

  2. javascript之this、new、apply和call详解

    this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一个思路从应用的角度来讲解this指针,从这个角度理解th ...

  3. SpringMVC中css,js,图片等静态资源被拦截的解决办法

    一.静态资源的存放路径 css,js,图片等静态资源存放在项目的路径必须为 二.html.jsp导入静态资源文件 html.jsp页面中的导入静态资源文件: js: css: 图片: 二.web.xm ...

  4. jmeter—建立测试计划

    一个测试计划描述了一系列 Jmeter 运行时要执行的步骤.一个完整的测试计划包含 一个或者多个线程组,逻 辑控制,取样发生控制,监听器,定时器,断言和配置元件. 一. 建立测试计划 在这一部分,你将 ...

  5. centos7安装配置MariaDB10

    1:添加 MariaDB yum 仓库 vi /etc/yum.repos.d/MariaDB.repo在该文件中添加以下内容保存: [mariadb] name = MariaDB baseurl ...

  6. linux CC攻击解决方法

    linux CC攻击1 由于不断的请求接口 导致带宽不足 然后不断的运行mysql语句 造成cpu饱和 这个时候服务器重负不堪 导致运行代码暖慢 导致入侵 一般采取的方法http://newmirac ...

  7. Linux文件的基本操作函数

    1.Linux文件的基本操作 Linux文件的基本操作主要包括了文件的创建.打开.读写和关闭等基本操作. 1.1.文件操作系统调用 (1)创建文件系统函数 int creat(const char * ...

  8. openstack集群访问外部服务出现访问失败

    场景描述: openstack私有云中的容器服务A(部署在openshift上)需要通过http访问阿里云中的B服务,中间需要经过openstack的nat网关,以及阿里云的lb.但在访问时发现访问失 ...

  9. c++中共享内存原理及实现

    共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...

  10. pom中parent和dependency区别以及dependencyManagement区别

    真的很详细 很感动 1.在同一个pom文件下,如果<dependencies>和<dependencyManagement>中都对该jar做了依赖,以<dependenc ...