【逆向思考 】【拓扑排序】1591. 奇怪的打印机 II

本文涉及的知识点

逆向思考 拓扑排序

LeetCode1591. 奇怪的打印机 II

给你一个奇怪的打印机,它有如下两个特殊的打印规则:

每一次操作时,打印机会用同一种颜色打印一个矩形的形状,每次打印会覆盖矩形对应格子里原本的颜色。
一旦矩形根据上面的规则使用了一种颜色,那么 相同的颜色不能再被使用 。
给你一个初始没有颜色的 m x n 的矩形 targetGrid ,其中 targetGrid[row][col] 是位置 (row, col) 的颜色。

如果你能按照上述规则打印出矩形 targetGrid ,请你返回 true ,否则返回 false 。

示例 1:

在这里插入图片描述

输入:targetGrid = [[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
输出:true
示例 2:
在这里插入图片描述

输入:targetGrid = [[1,1,1,1],[1,1,3,3],[1,1,3,4],[5,5,1,4]]
输出:true
示例 3:

输入:targetGrid = [[1,2,1],[2,1,2],[1,2,1]]
输出:false
解释:没有办法得到 targetGrid ,因为每一轮操作使用的颜色互不相同。
示例 4:

输入:targetGrid = [[1,1,1],[3,1,3]]
输出:false

提示:

m == targetGrid.length
n == targetGrid[i].length
1 <= m, n <= 60
1 <= targetGrid[row][col] <= 60

拓扑排序

给颜色x盖章,一定从最左上的x,改到最右下的x,否则会依赖。
逆向思考,从后向前思考。给x盖的时候,这个区域除了x,都已经处理。
用拓扑排序。
如果x所在的矩形包括y,此存在边边x → \rightarrow y

代码

核心代码

class CTopSort
{
public:	
	template <class T = vector<int> >
	void Init(const vector<T>& vNeiBo,bool bDirect = true )
	{
		const int iDelOutDeg = bDirect ? 0 : 1;
		m_c = vNeiBo.size();
		m_vBackNeiBo.resize(m_c);
		vector<int> vOutDeg(m_c);
		for (int cur = 0; cur < m_c; cur++)
		{
			vOutDeg[cur] = vNeiBo[cur].size();	
			for (const auto& next : vNeiBo[cur])
			{
				m_vBackNeiBo[next].emplace_back(cur);
			}
		}
		vector<bool> m_vHasDo(m_c);
		queue<int> que;
		for (int i = 0; i < m_c; i++)
		{
			if ( vOutDeg[i] <= iDelOutDeg)
			{
				m_vHasDo[i] = true;
				if (OnDo(i)) {
					que.emplace(i);
				}
			}
		}

		while (que.size())
		{
			const int cur = que.front();
			que.pop();
			for (const auto& next : m_vBackNeiBo[cur])
			{
				if (m_vHasDo[next] )
				{
					continue;
				}				
				vOutDeg[next]--;
				if (vOutDeg[next] <= iDelOutDeg )
				{
					m_vHasDo[next] = true;
					if (OnDo(next)) {
						que.emplace(next);
					}
				}
			}
		};
	}
	int m_c;
protected:
	virtual bool OnDo( int cur) = 0;
	vector<vector<int>> m_vBackNeiBo;	
	
};
class CMyTopSort : public CTopSort
{
public:
	int m_iCount = 0;
	virtual bool OnDo(int cur) override
	{
		m_iCount++;
		return true;
	}
};
class Solution {
public:
	bool isPrintable(const vector<vector<int>>& targetGrid) {
		vector<unordered_set<int>> vNeiBo(61);
		for (int x = 1; x <= 60; x++)
		{
			int l = 100, t = 100, right = -1, b = -1;
			for (int r = 0; r < targetGrid.size(); r++)
			{
				for (int c = 0; c < targetGrid.front().size(); c++)
				{
					if (targetGrid[r][c] == x)
					{
						l = min(l, c);
						right = max(right, c);
						t = min(t, r);
						b = max(b, r);
					}
				}
			}
			for (int r = t; r <= b; r++)
			{
				for (int c = l; c <= right; c++)
				{
					if (targetGrid[r][c] != x)
					{
						vNeiBo[x].emplace(targetGrid[r][c]);
					}
				}
			}
		}
		CMyTopSort topSort;
		topSort.Init(vNeiBo);
		return 61 == topSort.m_iCount;
	}
};

测试用例

template<class T, class T2>
void Assert(const T& t1, const T2& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}

}

int main()
{
	vector<vector<int>> targetGrid;
	{
		Solution sln;
		targetGrid = { {1,1,1,1},{1,2,2,1},{1,2,2,1},{1,1,1,1} };
		auto res = sln.isPrintable(targetGrid);
		Assert(true, res);
	}
	{
		Solution sln;
		targetGrid = { {1,1,1,1},{1,1,3,3},{1,1,3,4},{5,5,1,4} };
		auto res = sln.isPrintable(targetGrid);
		Assert(true, res);
	}
	{
		Solution sln;
		targetGrid = { {1,2,1},{2,1,2},{1,2,1} };
		auto res = sln.isPrintable(targetGrid);
		Assert(false, res);
	}
	{
		Solution sln;
		targetGrid = { {1,1,1},{3,1,3} };
		auto res = sln.isPrintable(targetGrid);
		Assert(false, res);
	}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/515809.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二、Docker部署Jenckins(详细步骤)

Docker部署Jenckins、初始化&#xff08;详细步骤&#xff09; 一、拉取镜像二、启动Jenkins三、访问Jenkins四、安装插件1.配置源2.插件安装 一、拉取镜像 docker安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 - 查询镜像 docker search jen…

通义灵码/Baidu Comate真能取代程序员吗?

目录 背景Baidu Comate通义灵码 思考 背景 Baidu Comate Baidu Comate提供AutoWork功能&#xff0c;号称“开发者只需定义需求&#xff0c;剩下的交给Comate AutoWork”。【李彦宏也说了&#xff0c;未来不会有程序员了~】 既然“Baidu Comate全新升级&#xff0c;向个人开发…

Flask Python:数据库多条件查询,flask中模型关联

前言 在上一篇Flask Python:模糊查询filter和filter_by&#xff0c;数据库多条件查询中&#xff0c;已经分享了几种常用的数据库操作&#xff0c;这次就来看看模型的关联关系是怎么定义的&#xff0c;先说基础的关联哈。在分享之前&#xff0c;先分享官方文档,点击查看 从文档…

C语言 | Leetcode C语言题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; int myAtoi(char * s){int i0;int out0;int pol1;int lenstrlen(s);if(len0) return 0;while(s[i] ) i; //删除空格if(s[i]-){ //判断正负pol-1;i;}else if(s[i]){pol1;i;}else{pol1;}while(s[i]!\0){if(s[i]<0||s[i]>9){ /…

Leetcode刷题笔记——多维动态规划篇

Leetcode刷题笔记——多维动态规划篇 第一题:最小路径和 Leetcode64&#xff1a;最小路径和&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的…

【JVM】关于JVM垃圾回收

文章目录 &#x1f334;死亡对象的判断算法&#x1f338;引用计数算法&#x1f338;可达性分析算法 &#x1f333;垃圾回收算法&#x1f338;标记-清除算法&#x1f338;复制算法&#x1f338;标记-整理算法&#x1f338;分代算法&#x1f338;哪些对象会进入新生代&#xff1f…

机器学习模型——逻辑回归

https://blog.csdn.net/qq_41682922/article/details/85013008 https://blog.csdn.net/guoziqing506/article/details/81328402 https://www.cnblogs.com/cymx66688/p/11363163.html 参数详解 逻辑回归的引出&#xff1a; 数据线性可分可以使用线性分类器&#xff0c;如果…

一文搞懂cookie,session,token,JWT到底是怎么进行验证的???

文章目录 cookiesessiontokenJWT 比较 HTTP 协议是一种无状态协议&#xff0c;每次服务端接收到客户端的请求时&#xff0c;都是一个全新且独立请求&#xff0c;这样就无法获取历史请求的记录&#xff0c;为了解决这种机制&#xff0c;让某个域名下的所有网页能够共享某些数据&…

DFS:深搜+回溯+剪枝解决组合问题

创作不易&#xff0c;感谢支持!!! 一、电话号码的组合 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string hash[10]{"","","abc","def","ghi","jkl","mno","pqrs"…

salesforce如何批量reassign审批人

salesforce的审批流程中&#xff0c;如果希望批量将审批人重新指派&#xff0c;可以在set up 中找到Mass Transfer Approval Processes选项进行reassign。 参考&#xff1a;https://trailhead.salesforce.com/zh-CN/trailblazer-community/feed/0D54S00000A7QNLSA3 还可以用a…

30.多个线程交替执行

线程一输出a,5次&#xff1b; 线程二输出b,5次&#xff1b; 线程三输出c,5次&#xff1b; 现在要求输出abcabcabcabcabc怎么实现&#xff1f; 采用wait和notifyAll实现 public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify new Wai…

Linux------一篇博客了解Linux最常用的指令

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

LInux脚本学习

1.注释 #单行注释 以 # 字符开头就是单行注释 当然第一行除外&#xff0c;比较特殊 2.多行注释 3.Shell文件的作用 Shell文件就是linux命令集 4.sh脚本的执行方式 bash xxx.sh 5.新建的文件会没有执行权限 #为文件赋予执行权限 chmod ux xxx.sh 6.编写规范 #!/bin/bash #…

C#,简单,精巧,实用的按类型删除指定文件的工具软件

点击下载本文软件&#xff08;积分&#xff09;&#xff1a; https://download.csdn.net/download/beijinghorn/89059141https://download.csdn.net/download/beijinghorn/89059141 下载审核通过之前&#xff0c;请从百度网盘下载&#xff08;无积分&#xff09;&#xff1a;…

Canvas背景绘制-24

本节会详细介绍下&#xff0c;如何绘制面板的背景。 概述 常用的技术称为图块复制(blitting)&#xff0c;即从离屏缓冲区中将内容发生变化的那部分背景图像复制到屏幕上&#xff0c;还有其它两种方法是将所有内容擦除并重新绘制&仅重绘内容发生变化的那部分区域。一般是用…

解决Vue中仓库持久化的问题,不借助插件用原生JS实现仓库持久化。了解仓库的插件机制、监听的时机

1、演示 前言&#xff1a;目前Vue有两种仓库&#xff0c;一种是Vuex&#xff0c;一种是Pinia&#xff0c;懂得都懂&#xff0c;这里就不详细介绍这两者的区别了 2、什么是持久化 仓库里面的数据是需要跨越页面周期的&#xff0c;当页面刷新之后数据还在&#xff0c;在默认情况下…

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码&#xff0c;这个是sg的加密,免费可用(目前)并不会收费 源码说明&#xff1a;下载直接上传即可 下载地址 蓝奏云下载&#xff1a;https://wfr.lanzout.com/i6c331togiji

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索&#xff1a;为什么是B树&#xff1f; 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式&#xff1a;二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树&#xff1a;AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…

常见的四种限流算法及基础实现

常见的四种限流算法及基础实现 什么是限流有哪些限流算法&#xff1f;限流算法固定窗口滑动窗口漏桶算法令牌算法 什么是限流 限流是对某一时间窗口内的请求数进行限制&#xff0c;保持系统的可用性和稳定性&#xff0c;防止因流量暴增而导致的系统运行缓慢或宕机。 在高并发…

基于SpringBoot+uniapp的同城活动报名系统开发找搭子软件

项目背景 随着移动互联网的飞速发展&#xff0c;人们的社交方式也在不断变化。在这个大背景下&#xff0c;同城活动报名系统应运而生&#xff0c;成为了连接人与人、活动与人之间的桥梁&#xff0c;深受广大年轻人的喜爱。在这个充满机遇与挑战的时代&#xff0c;同城活动报名…