计算搭积木是否能拼接成一个整体
题目描述:
一天,小明买了许多积木回家,他想把这些积木拼接在一起。每块积木有两个接口,每个接口我们用一个数字标记,规定只有当两块积木有相同数字标记的接口时,这两块积木才可以通过该接口拼接在一起。举例,有两块积木,接口数字分别为1,2和3,4,那么这两块积木无法拼接;若两块积木接口数字分别为1,2和2,3,那么这两块积木可以通过由数字2标记的接口拼接在一起。现在小明知道所有积木的数量和每块积木接口的数字标记,你能告诉他他可以将所有积木拼接成一个整体么?
输入描述
第一行一个整数t,表示测试数组组数1≤t≤10;
接下来在每组测试数据中:
第一行一个整数n,表示积木的数量1≤n≤100000,
下面n行每行2个整数x,y,表示其中一块积木的两个接口的数字标记;1≤x,y≤100000;
输出描述
对于每组测试数据,输出”YES”,表示该组数据中的所有积木可以拼接成一个整体,”NO”表示不行。(注意输出不包括引号)
样例输入
2 3 1 2 2 3 4 5 6 1 2 2 3 3 5 4 5 4 6 5 1
样例输出
NO YES
题目来自于:https://www.acmcoder.com/#/practice/code
每一个积木都可以当作是一条边,接口则看作节点,若能连成一条有回路的环路或者无回路的连通图则结果为yes
数据结构中有对应结构, 欧拉路的概念如下,
欧拉通路 (欧拉迹):通过图中每条边且只通过一次,并且经过每一顶点的通路。
欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次,并且经过每一顶点的回路。
简单说欧拉通路就是首尾不相接,而欧拉回路要求首尾相接。
无向图是否具有欧拉通路或回路的判定:(节点v的度是指和v相关联的边的数目)
欧拉通路:图连通;图中只有2个度为奇数的节点(就是欧拉通路的2个端点)
欧拉回路:图连通;图中所有节点度均为偶数
所以若能组成欧拉通路或欧拉回路即可以将所有积木拼接成一个整体
1、计算节点个数,对应添加数组对象,用于计算节点的度
2、计算每个节点的度
3、判断是否是欧拉通路或者欧拉回路
//arr = [[1,2],[2,3],[4,5]]
var printOut = function(arr){//1、节点去重添加到forarr内let blockarr = []arr.forEach(item=>{blockarr.push(...item);})blockarr=new Set(blockarr)//blockarr:[1,2,3,4,5]let forarr = {}blockarr.forEach(item=>{forarr[item]=[]})//forarr:{1:[],2:[],3:[]...}//2、计算每个节点的度arr.forEach(item=>{let flag1 = Object.keys(forarr).indexOf(JSON.stringify(item[0]))let flag2 = Object.keys(forarr).indexOf(JSON.stringify(item[1]))flag1>-1 && forarr[JSON.stringify(item[0])].push(item[1])flag2>-1 && forarr[JSON.stringify(item[1])].push(item[0])})console.log(forarr)//forarr:{1:[2],2:[1,3],3:[2],4:[5],5:[4]}//3、去重,Object.keys(forarr).forEach(item=>{forarr[item] = [...new Set(forarr[item])]})//判断是否是欧拉回路或者欧拉通路let res = Object.keys(forarr).filter(item=>{return forarr[item].length%2===1})console.log(res.length>2?'NO':'YES')
}
printOut([[1,2],[2,3],[4,5]])
结果:(可以直接复制以上代码,浏览器右键检查显示开发者模式,点击console栏,粘贴代码回车即可看到效果)
//printOut([[1,2],[2,3],[4,5]])
NO
//printOut([[1,2],[2,3],[3,5],[4,5],[4,6],[5,6]])
YES
测试用例:
[[1,2],[2,3],[4,5]]
no
[[1,2],[2,3],[3,5],[4,5],[4,6],[5,6]]
yes
[[1,2],[2,3],[3,5],[4,5],[5,6],[4,2],[4,6]]
no
[[1,2],[2,4],[4,6],[6,7],[8,9]]
no
[[1,2],[2,4],[4,6],[6,7],[7,9]]
yes
[[1,2],[2,3],[3,2],[2,3],[3,2],[6,4],[4,6]]
no
[[1,2],[2,3],[2,4],[3,4]]
yes
[[1,2],[2,3],[3,2],[2,3],[3,4],[6,4],[4,6]]
yes
计算搭积木是否能拼接成一个整体相关推荐
- gpxclear寄存器写0和写1_画图,搭积木,写对象 [TF 笔记 0]
前言 从2019年9月底到现在,TF 2.0 已经正式发布三个多月了.但其实很多和 2.0 相关的特性,比如说 eager 模式,@tf.function 装饰器和 AutoGraph, 以及 ker ...
- 【机器视觉案例】(10) AI视觉搭积木,手势移动虚拟物体,附python完整代码
各位同学好,今天和大家分享一下如何使用 opencv+mediapipe 完成手势移动虚拟物体,可自定义各种形状的物体,通过手势搭积木.先放张图看效果. 规则:当食指在某个物体内部,并且中指指尖和食指 ...
- 蓝桥杯-搭积木-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- Kaggle HousePrice : LB 0.11666(排名前15%), 用搭积木的方式(一,原理)
关键词: 机器学习, 特征工程,调参, 比赛, Kaggle, House Price, 搭积木, 管道, Pandas Pipe, Sklearn Pipeline 本文预计阅读时间需要15分钟. ...
- 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程...
编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...
- 将两个数组不同的元素拼接成一个字符串
1.创建两个长度为10的数组,数组内元素为随机生成的.不重复的 1-100之间的整数. 2.定义一个方法,传入两个数组,方法中将两个数组不同的元素拼接成一个字符串,并且将该字符串以及字符串的长度输出到 ...
- 详讲全排列算法,及解决数字搭积木问题
如果你是做这道题不会,那么你可以看这道题的解题思路,如果你是不太理解全排列算法,那么你可以通过这个题来理解. 题目描述: 小明最近喜欢搭数字积木.一共有10块积木,每个积木上有一个数字,0~9. 搭积 ...
- SAP那些事-职业篇-26-企业信息化:从拼图到搭积木
所有文章在公众号"MZ信息化咨询杂谈"同步更新,习惯公众号阅读的朋友可直接关注公众号哦. 今天在网上看到一个说法,说以前呢,我们学习有点像拼图,每个学科,每一种学问都已经是一张画好 ...
- 5_竞赛无人机搭积木式编程——以2021年电赛G题植保无人机国奖标准完整复现为例学习
竞赛无人机搭积木式编程 --以2021年电赛G题植保无人机国奖标准完整复现为例学习 首先我们需要了解下自动飞行任务执行过程几组关键变量的用法与实际作用效果: flight_subtask_cnt用于控 ...
最新文章
- 在人工智能时代,我们更需要理解自己的智能 | 艾伦脑科学研究所所长克里斯托夫·科赫STEP峰会演讲实录
- [Oracle]为何Archivelog 没有马上被删除
- cocos2dx对所有子节点设置透明度
- 傻瓜教程:asp.net(c#) 如何配置authentication,完成基于表单的身份验证
- IntelliJ IDEA14 配置 SVN
- 【Java虚拟机】Java虚拟机深度讲解、VisualVM工具、JVM调优
- Linux 发行版之 CentOS 简介
- 根据浏览器navigator区分PC端还是移动端,区分操作系统,区分浏览器型号
- 雷林鹏分享:YII 模型-视图-控制器(MVC)设计模式
- 双11 拼多多iPhone 11系列香气扑鼻:最高降幅达1600元
- jquery validate 联动验证
- matlab线旋转成面,用matlab怎么绘制一条曲线绕z轴旋转生成的曲面?
- Markdown 模板
- STM32F107 资料
- 电影院票务管理系统数据库设计
- 世界杯winner只属于你——MESSI
- VisualDMIS 6.5探测误差程序(25点球)
- 什么是赋范线性空间、内积空间,度量空间,希尔伯特空间
- 区块链:分布式系统核心技术
- Maven配置本地仓库和阿里云镜像仓库不生效的解决方法