【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年的,应该是后续做了更新) 一…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
