POJ1222、POJ3279、POJ1753–Flip

为什么将着三个题放一起讲呢?因为只要搞明白了其中一点,就可以一次3ac了~~

首先讲下每个题目的意思

1.EXTENDED LIGHTS OUT

给你5行6列的01矩阵,0代表该点的灯是关闭的,1代表该点的灯是开着的,要求出每一栈灯是否按下,使得所有的灯都熄灭,当然,按下某一盏灯时,它附近的灯也会变成原来相反的状态,如图所示。

2.Fliptile

一群奶牛,喜欢白色瓷砖,输入n*m的01矩阵,0表示白色,1表示黑色,问每个砖块该怎么翻转,最后使得所有的颜色都是白色,要求对应的翻转的矩阵对应的字典序最小。每翻转一个,周围的也会变化。如果不可以输出IMPOSSIBLE

3.Flip Game

问你针对途中黑白色圈圈,输出将图中所有的颜色全部变成白色或全部变成黑色的最小的一种翻转次数。

如果怎么都翻转失败,输出Impossible

通过三个题目意思得知,它们有共同点。 最后都要求最后是同一种颜色而且翻转一个点势必会影响周围的四个的原来的颜色状态

除了第一个,二三都存在Impossible的情况。

下面开始介绍思路(假设求解把所有的点变为0|白色的翻转方案),对于nm个格子,每个格子对应有2中状态,那么,我把所有的状态都搜索一遍,找出合适的翻转方案可以不??当然可以,但是十有八九会T掉。因为光44的矩阵就由2^16种状态了,更别说大一点的了。所以暴搜是不可取的。

对于每一种操作,都会对应上述这样情况,那我们该从哪个点开始呢??

因为题目要求矩阵中所有的点都变为同一色,而每个操作互相影响,所以 搜索要一行一行来,但是如果后一行的全为0,当前行的某一个操作又影响到上一行和下一行,那后面的又白费了,这样要搞到什么时候??

试想一下,如果 第一行的翻转方案确定了,那么第一行的翻转势必影响到第二行的翻转,第二行的翻转也会影响到第三行的翻转,一直到最后一行。。。也就是说,第一行的翻转方案会影响到整个翻转的结果。

而第一行的翻转状态有多少呢??只有2^m(列号)(用二进制对应每个点的状态)个,这比搜索所有的状态要少多了

我们还要看一个问题,因为 每个点的状态只有两个,0和1,自己翻转肯定改变自己的状态,也会影响周围临近4个点的状态,周围的翻转也会影响自己。但是,有个 次数的问题。就如同灯开了2次,4次,6次…到最后还是恢复成原来的状态了。

即如果当前自己为1,自己加周围4个总共翻转了5次,那么自己变成了几???5次后,自己变成了0。也就是说,这个点在周围和自己的影响下,变成了目标(0)的状态,那么,这个点还用去翻转吗??当然不用了

如果是0,一样的道理,所以 总结出一点:若cnt表示当前点的状态信息(0|1),sum表示自己加周围临近的4个的所有翻转次数,那么最终这一点是否要翻转取决于(cnt +sum)% 2的值.

当前是1,临近点加自己总共翻转5次,那么自己变成0。即最终自己不需要额外翻转一次
当前是1,临近点加自己总共翻转4次,那么自己变成1,最后自己要多翻转一次才能变成0
当前是0,临近点加自己总共翻转5次,自己变成1,那么自己要多翻转一次才能变成0
当前是0,临近点加自己总共翻转4次,那么自己变成0,不需要额外翻转了

得出结论,当前点是否需要翻转取决于 (原来自己的状态+所有对自己起作用的翻转数) % 2, 结果为1表明要翻转,为0表明不需要了。这里不清楚的可以自己多写几个看看

好了,第一行的状态数知道了,即每个点的怎么翻转知道了,该怎么求最终结果呢??

因为 已经知道了第一行的所有翻转方案(0 ~ 2^m-1个),那么对所有方案搜索,直到最后一行的所有的翻转方案都是0就表明第一行的翻转方案是可取的了。。。这什么意思呢

如果 搜索到最后,发现最后一行存在几个数是需要翻转的,即这几个数是在上层的翻转作用下变成了1,最后还需要把这几个1翻转一下才会变成0,但是,当你翻转这几个1,势必又影响到上一层,结果上一层又出现几个1。再往上翻,就打乱了所有的状态。所以第一行的翻转方案一定是不可行的 。

要点: 在第一行的翻转方案搜索中,通过搜索第一行的翻转方案,用第二行的翻转去改变第一行的状态(将1变为0)。接下来的每一行继续用下一行去调整但前行的状态,直至全为0。。。,最后观察最后一行是否需要调整,需要就没戏了,不需要说明OK了。

举个例子,第一行的翻转方案为7:111

上述过程强烈建议手动模拟一下,其实在计算机计算时,先考虑了000的方案,然后会往后找次数更少的方案,看能否找到次数最少的方案(具体看题目要求)。

贴一下代码:

这里在对这段代码进行简单说明下

其中i表示从0到2^m次方的所有的翻转方案,就把m看成3把。flip[i][j]表明第i行第j列是否要翻转,所以第一行有2^3==8中翻转方案

在对解题做个简要说明,POJ1222规模确定,确保可行,直接做即可。POJ3279也十分类似

对于1753,分别需要计算全部翻为白色的最少翻转次数和全部翻为黑色的最少翻转次数。其实只要将输入的b和w对应的1 和 0 调换下,两次始终求解将1 全部换成0的方案数,最终取最小值即可。

Original: https://www.cnblogs.com/ygsworld/p/11266329.html
Author: 回忆酿的甜
Title: POJ1222、POJ3279、POJ1753–Flip

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582142/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Xvfb相关命令

    第一种启动方法:Xvfb :99-ac2>/dev/nullexport DISPLAY=:99xhost + & 第二种启动方法Xvfb-ac${DISPLAY:-…

    Linux 2023年6月13日
    0104
  • 网心云在PVE下三种磁盘IO模式(No cache,Write through,Write back)选择与优化指南

    最近在用网心云跑PCDN业务,由于是架在PVE环境上的,因此如何对磁盘IO进行优化就成了最大的问题… 1,开启虚拟机IO thread,有效降低CPU负载 2,强制CP…

    Linux 2023年5月27日
    0249
  • 操作系统实现-loader

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 大家好呀,终于我们到了操作系统的loader部分了,loader也是操作系…

    Linux 2023年6月13日
    073
  • 灵敏度分析简介

    参考文章1 😄参考文章2 😸参考文章3 😃 1. 灵敏度分析: 某一个假定的常量,在现实中不可能完全保持不变,可能发生一定范围的波动。灵敏度分析就是检验这部分波动对结果的影响。 灵…

    Linux 2023年6月14日
    0102
  • Linux_shell基础

    注意, 这里在运行时一定要写成./test.sh,而不是 test.sh, 运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有…

    Linux 2023年5月27日
    0114
  • 初识前后端

    初识前后端 在学习了解前后端的过程中,自己看到了这一篇好的文章,摘下了一些当下用的的内容,供复习参考。 什么是前端开发? 前端开发主要涉及网站和 App,用户能够从 App 屏幕或…

    Linux 2023年6月13日
    0113
  • linux inode 详解 / 线上inode爆满解决方案

    linux inode 详解 / 线上inode爆满解决方案 本文大量参考阮一峰大神博客,整理笔记 之所以&amp…

    Linux 2023年6月7日
    0113
  • python向access插入数据,报语法错误的一个解决思路(-2147352567,’发生意外。’)

    工作中遇到一个古老的程序,数据库使用的事access,想用python批量导入数据,报” INSERT INTO 语句的语法错误”。 但是,将插入语句放到a…

    Linux 2023年6月14日
    082
  • Linux下IPC之共享内存的使用方法

    基本参考 《Unix环境高级编程》 第14.9节共享内存来学习。 需要说明的 讲shmget(key,size, flag)函数时,书上大概意识是说, 想访问已有的shm时,key…

    Linux 2023年6月7日
    079
  • ShardingSphere-proxy-5.0.0分布式哈希取模分片实现(四)

    一、说明 主要是对字符串的字段进行hash取模 二、修改配置文件config-sharding.yaml,并重启服务 # Licensed to the Apache Softwa…

    Linux 2023年6月14日
    079
  • Celery异步任务

    情景: 用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等…

    Linux 2023年6月8日
    087
  • 【设计模式】Java设计模式-单例模式

    【设计模式】Java设计模式 – 单例模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🌝分享学习心得,欢迎指正,大家一起学习…

    Linux 2023年6月6日
    0153
  • 通过示例学习PYTORCH

    核心是:PyTorch提供了两个主要的特性: 一个n维的Tensor,与Numpy相似但可以在GPU上运行 构建和训练神经网络的自动微分 我们将使用一个三阶多项式拟合 (y=sin…

    Linux 2023年6月14日
    0110
  • 基本数据类型的长度

    32位机器和64位机器中int、char等数据类型所占字节长度对比。 在32位机器和64机器中int类型都占用4个字节。编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:s…

    Linux 2023年6月13日
    093
  • HBuilderX配置外部服务器(tomcat)查看编辑jsp界面

    HBuilderX配置外部服务器(tomcat)查看编辑jsp界面 一、第一种方法,通过启动本地tomcat,查看jsp 在tomcat的webapps目录下创建文件夹HBuild…

    Linux 2023年6月7日
    077
  • MySQL-报错:Error when bootstrapping CMake:

    在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root…

    Linux 2023年6月13日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球