【POJ-3279】Fliptile(递推+搜索)
POJ-3279. Fliptile(递推+搜索)
Vjudge链接
题目描述
农场主约翰知道,一头智力得到满足的奶牛是一头快乐的奶牛,它会产更多的奶。他为奶牛安排了一项脑力活动,让它们摆弄一个 M × N M × N M×N 的方格 ( 1 ≤ M ≤ 15 ; 1 ≤ N ≤ 15 ) (1 ≤ M ≤ 15;1 ≤ N ≤ 15) (1≤M≤15;1≤N≤15),每个方格的一面是黑色的,另一面是白色的。
正如人们所猜测的那样,当翻转一块白色瓷砖时,它就会变成黑色;当翻转一块黑色瓷砖时,它就会变成白色。当奶牛翻转瓷砖,使每块瓷砖的白色面朝上时,它们就会得到奖励。不过,奶牛的蹄子比较大,当它们试图翻转某块瓷砖时,也会翻转所有相邻的瓷砖(与被翻转瓷砖共用一条完整边缘的瓷砖)。由于翻转很累,奶牛们希望尽量减少翻转的次数。
帮助奶牛确定所需的最少翻转次数,以及为达到最少翻转次数而需要翻转的位置。如果有多种方法都能以最少的翻转次数完成任务,则在输出中以字符串形式返回词序最少的一种方法。如果任务不可能完成,则打印一行并注明 “IMPOSSIBLE”。
输入:
第 1 1 1 行 两个空格分隔的整数: M M M 和 N N N
第 2... M + 1 2...M+1 2...M+1 行: 第 i + 1 i+1 i+1 行描述网格第 i i i 行的颜色(从左到右),用 N N N 个空格分隔的整数表示, 1 1 1 表示黑色, 0 0 0 表示白色
输出:
第 1... M 1...M 1...M 行:每行包含 N N N 个空格分隔的整数,每个整数指定特定位置的翻转次数。
样例输入:
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
样例输出:
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
题意
给定一个 01 01 01 矩阵,可以任意选择翻转一个点,使得 0 0 0 变成 1 1 1 , 1 1 1 变成 0 0 0 ,并且该点上下左右的四个点会按照同样的规律进行翻转,现在问最少需要翻转多少次,可以使得整个矩阵都是 0 0 0 ,如果有多种方式,请输出字典序最小的一种,若无法达到则输出 “impossible”。
思路
首先,一个点翻转两次及以上是没有意义的。因为,翻转两次等于不反转,翻转奇数次等于翻转一次,所以我们只需要考虑翻转一次的情况。
那么,每个点只有翻与不翻两种情况,直接枚举的话, n ∗ ( 2 n ) n*(2^n) n∗(2n) 会超时,所以需要优化枚举方式。
这里设翻转某个点 (i, j)
的操作为 turn(x, y)
,如果逐个枚举的话,当翻转当前点的时候,会使上一行也翻转,从而破坏上一行的状态,所以只能用下一行去改变上一行的状态。
并且,操作的顺序也不会影响最终的结果。那么,若当前行某一点 (i, j)
的状态为 1
,那就可以用所在列的下一行 (i + 1, j)
去执行 turn
操作,使得 (i, j)
的状态变为 0
。
综上,我们可以先确定第一行的操作方案,枚举第一行所有的操作,再依此递推后面行数的情况,最后判断最后一行的状态是否全部变成了 0
即可。
同时,我们使用二进制枚举第一行的话,还可以保证是按字典序来枚举的,也符合题目要求。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
#define IOS ios::sync_with_stdio(false), cin.tie(0);using namespace std;
const int N = 20;// 翻转数字上下左右,1->0,0->1,需要将所有的数都变成0
int n, m;
int g[N][N], backup[N][N]; // 原数组,备份数组(备份数组用来恢复原来的状态)
int temp[N][N]; // 临时状态数组(保存每次枚举时当前数组的状态)
int ans[N][N]; // 答案数组
int dx[] = {0, -1, 0, 1, 0};
int dy[] = {0, 0, 1, 0, -1};
int res;// 转换瓷砖状态
void turn(int x, int y)
{for (int i = 0; i < 5; i++){int xx = x + dx[i], yy = y + dy[i];if (xx >= 0 && xx < n && yy >= 0 && yy < m){g[xx][yy] ^= 1; // 异或,变成相反数// if (g[xx][yy] == 1) g[xx][yy] = 0;// else g[xx][yy] = 1;}}temp[x][y] = 1;
}void work()
{//先枚举第一行的所有情况,使用二进制枚举,一共2^m种for (int k = 0; k < 1 << m; k++){int cnt = 0;memcpy(backup, g, sizeof g); //备份原数组memset(temp, 0, sizeof temp); //每次都需要初始化临时数组// 对第1行处理for (int j = 0; j < m; j++)if (k >> j & 1){cnt++;turn(0, j);}// 逐个枚举第2~n-1行for (int i = 0; i < n - 1; i++)for (int j = 0; j < m; j++)if (g[i][j] == 1){cnt++;turn(i + 1, j); // 对下一行处理}bool flag = true;for (int j = 0; j < m; j++) // 判断最后一行是否合法if (g[n - 1][j] == 1){flag = false;break;}// 判断最小操作次数if (flag && cnt < res){res = cnt;memcpy(ans, temp, sizeof temp); // 更新答案数组}// 枚举完一种情况后还原成初始状态memcpy(g, backup, sizeof backup);}
}int main()
{IOS;res = INF;cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> g[i][j];work();if (res == INF) cout << "IMPOSSIBLE" << endl;else {for (int i = 0; i < n; i++){for (int j = 0; j < m; j++)cout << ans[i][j] << ' ';cout << endl;}}return 0;
}
相关文章:
【POJ-3279】Fliptile(递推+搜索)
POJ-3279. Fliptile(递推搜索) Vjudge链接 题目描述 农场主约翰知道,一头智力得到满足的奶牛是一头快乐的奶牛,它会产更多的奶。他为奶牛安排了一项脑力活动,让它们摆弄一个 M N M N MN 的方格 ( 1 ≤ M ≤ 15 …...
522个matplotlib绘图案例,包含:折线图、散点图、条形图、饼图、直方图、3D图等,源码可直接运行!
文章目录 matplotlib介绍图表介绍折线图(Line Plot)散点图(Scatter Plot)条形图(Bar Plot)饼图(Pie Chart)直方图(Histogram)箱线图(Box Plot&…...

windows安装Elasticsearch8.9.0
官网解压安装好路径(非中文,无空格) 可参考 言之有李LAX csdn http://t.csdn.cn/S2oju本人使用jdk17 修改配置elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl:enabled: false直接点击bin\elasticsearch.bat…...

用Delphi编写一个通用视频转换工具,让视频格式转换变得更简单
用Delphi编写的简单视频格式转换程序,它使用TComboBox、TOpenDialog和TSaveDialog组件来选择转换格式、选择源视频文件和选择目标视频文件。程序还使用TEdit组件允许用户输入参数,然后将这些组件中的信息拼接成转换命令并在DOS窗口中运行它。 procedure…...
Kafka系列之:安装Know Streaming详细步骤
Kafka系列之:安装Know Streaming详细步骤 一、相关技术博客二、安装elasticsearch1.下载elasticsearch2.创建数据目录3.创建es用户4.修改最大文件数5.解压elasticsearch6.赋予es用户目录权限7.修改es配置8.切换es用户启动elasticsearch三、安装KnowStreaming1.下载KnowStreami…...

绝杀 GETPOST 嵌套的 JSON 参数
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序中的数据传输。在HTTP数据包信息传递时,JSON扮演着非常正常的角色,因为它是一种通用的数据格式,可以被多种编程语言和应用程…...

Spring 项目过程及如何使用 Spring
文章目录 1.创建 Spring 项目步骤1.1 创建 Maven 项目1.2添加 Spring 框架支持1.3 添加启动项2.如何使用 Spring2.1 存储 Bean 对象2.1.1 创建 Bean对象2.1.2 将 Bean对象注册到容器中 2.2 获取并使用 Bean对象2.2.1 使用 ApplicationContext 获取对象2.2.2 使用 BeanFactory 获…...

信息学奥赛一本通——1258:【例9.2】数字金字塔
文章目录 题目【题目描述】【输入】【输出】【输入样例】【输出样例】 AC代码 题目 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。 在上面…...

selenium官网文档阅读总结(day 2)
1.selenium元素定位方法 1.1selenium命令 当我们使用chormdriver打开网页后,接下来就要用python操作元素,模拟用户会作出的操作,这些操作元素的方法就是命令。比如 (1) click:点击(按钮,单选框ÿ…...

VMware虚拟机安装VMware tools
一、挂载光驱 执行以下命令来创建 /mnt/cdrom 目录: mkdir -p /mnt/cdrom-p 参数会确保如果 /mnt/cdrom 的上级目录(例如 /mnt)不存在的话也会被创建。 然后,你可以再次尝试挂载光盘: mount /dev/sr0 /mnt/cdrom这次…...

【Linux命令200例】rm用来删除文件或目录(谨慎使用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜…...

行云管家荣获CFS第十二届财经峰会 “2023产品科技创新奖”
7月26日至27日,CFS第十二届财经峰会暨2023可持续商业大会在京盛大召开。峰会主题为“激活高质量发展澎湃活力”,超1000位政商领袖、专家学者、企业及媒体代表出席了本次盛会,共同分享新技术新产品新趋势、研判全球新挑战与新变局下企业的机遇…...
uniapp禁止页面滚动
用 touchmove.stop.prevent“moveHandle”,moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。 <viewclass“mask” touchmove.stop.prevent“moveHandle”>...

ModuleNotFoundError: No module named ‘_sqlite3‘
前言 遇到报错信息如下: ModuleNotFoundError: No module named _sqlite3解决方式 参考解决方式: https://blog.csdn.net/jaket5219999/article/details/53512071 find / -name _sqlite*.socp /usr/lib64/python3.6/lib-dynload/_sqlite3.cpython-36…...
Rust的入门篇(下)
这篇博客是rust入门篇下 45. 生命周期注释 // 生命周期// 下面代码不能通过编译 // longer 函数取 s1 和 s2 两个字符串切片中较长的一个返回其引用值 // 返回值引用可能会返回过期的引用 // fn longer(s1: &str, s2: &str) -> &str { // if s2.len() >…...
PYTHON-logging-工具类-支持中文字符控制台输出和文件写入-不会导致乱码
import logging import sys import os import time from logging.handlers import RotatingFileHandler import iodef get_logger(tag):# 创建一个新的输出流,并指定编码为UTF-8sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)accPath logsif not…...
对gpt的简单认识
1.gpt是什么? GPT(Generative Pre-trained Transformer 生成式预训练Transformer模型)是一种基于Transformer架构的预训练语言模型,由OpenAI开发。GPT模型以无监督学习的方式使用大规模语料库进行预训练,并具有生成文…...

java类和对象详解(1)
面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序,更…...
RxJava 倒计时,轮询器
笔记 倒计时 /*** 短信倒计时** param s*/private Subscription subscription30;public void startCountdownFinishRx30(int s) {clearFinishSubscription30();subscription30 Observable.interval(0, 1, TimeUnit.SECONDS).take(s 1).map(new Func1<Long, Long>() {O…...

SE-Net注意力机制
📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...