2241 排序二叉树

2241 排序二叉树

2001年CTSC国家队选拔赛

时间限制: 1 s

空间限制: 64000 KB

题目等级 : 大师 Master

题解

题目描述 Description

一个边长为n的正三角形可以被划分成若干个小的边长为1的正三角形,称为单位三角形。边长为3的正三角形被分成三层共9个小的正三角形,我们把它们从顶到底,从左到右以1~9编号。同理,边长为n的正三角形可以划分成n2个单位三角形。

四个这样的边长为n的正三角形可以组成一个三棱锥。我们将正三棱锥的三个侧面依顺时针次序(从顶向底视角)编号为A, B, C,底面编号为D。侧面的A, B, C号三角形以三棱锥的顶点为顶,底面的D号三角形以它与A, B三角形的交点为顶。左图为三棱锥展开后的平面图,每个面上标有圆点的是该面的顶,该图中侧面A,B,C分别向纸内方向折叠即可还原成三棱锥。我们把这A、B、C、D四个面各自划分成n2个单位三角形。

对于任意两个单位三角形,如有一条边相邻,则称它们为相邻的单位三角形,显然,每个单位三角形有三个相邻的单位三角形。现在,把1~4n2分别随机填入四个面总共4n2个单位三角形中。

现在要求你编程求由单位三角形组成的最大排序二叉树。所谓最大排序二叉树,是指在所有由单位三角形组成的排序二叉树中节点最多的一棵树。对于任一单位三角形,可选它三个相邻的单位三角形中任意一个作为父节点,其余两个分别作为左孩子和右孩子。当然,做根节点的单位三角形不需要父节点,而左孩子和右孩子对于二叉树中的任意节点来说并不是都必须的。

输入描述 Input Description

其中第一行是一个整数n,随后4n2行,依次为三棱锥四个面上所填的数字。

输出描述 Output Description

其中仅包含一个整数,表示最大的排序二叉树所含的节点数目。

样例输入 Sample Input

3


19

33

32

31

29

3

5

4

30


22

25

20

21

12

24

23

34

35


14

13

15

26

18

17

8

16

27


11

10

9

1

28

7

2

6

36

样例输出 Sample Output

17

数据范围及提示 Data Size & Hint

1<=n<=18

分类标签 Tags 点此展开

记忆化搜索 递归 搜索 大陆地区 CTSC国家队选拔赛 2001年

原题重现:http://acm.wust.edu.cn/problem.php?id=2549&soj=8

Description

Input

其中第一行是一个整数n(1<=n<=18),随后4n2行,依次为三棱锥四个面上所填的数字。

Output

其中仅包含一个整数,表示最大的排序二叉树所含的节点数目。

Sample Input

3
19
33
32
31
29
3
5
4
30
22
25
20
21
12
24
23
34
35
14
13
15
26
18
17
8
16
27
11
10
9
1
28
7
2
6
36

Sample Output

17

AC代码暂缺
时间: 2024-08-02 11:26:30

2241 排序二叉树的相关文章

排序二叉树的基本操作

描述 二叉树的构建.插入新的结点.树的先中后序以及层序四种遍历 代码 import java.util.LinkedList; import java.util.Queue; class Node{ public int data; public Node left; public Node right; public Node(int data){ this.data=data; this.left=null; this.right=null; } } public class BinaryT

二叉树及排序二叉树的相关操作汇总

前记:由于种种原因,以前一看到什么树啊链表啊,那就相当的恐惧,真是惭愧,最近仔细研究了一下这些东西,发现也就那样,或许是我之前根本就没怎么花心思学.. 话不多说,下面就直接上代码吧,也没什么好解释的,只要我自己理解代码就行了,哈哈哈... 代码参考<C和C++程序员面试秘笈>一书 // Tree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stack> #include <queue>

TreeMap源码分析之一 —— 排序二叉树、平衡二叉树、红黑树

一.排序二叉树(BST树) 1.排序二叉树的定义 排序二叉树,Binary Sort Tree 排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树: (1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: (2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值: (3)它的左.右子树也分别为排序二叉树. 按中序遍历排序二叉树可以得到由小到大的有序序列. 比如 2.排序二叉树的插入和删除 二.平衡二叉树(Balanced Binary Tree,AVL树) 三.红黑

排序二叉树

题目大意:请完成下面四个函数的定义(在tree.h文件中),使整个程序能够利用排序二叉树的结构对输入的数(不会出现相同的数),进行排序输出.节点的结构体在下面已给出,这个二叉树的特征是,左子数的值肯定比父节点小,右子树的值肯定比父节点的大.要求大家按照这个结构特征去构建二叉树,最后中序遍历输出就是我们要求的升序输出. 树的节点结构体为: typedef struct Node { struct Node *left; struct Node *right; int value; } Node;

纪念逝去的岁月——C/C++排序二叉树

1.代码 2.运行结果 3.分析 1.代码 #include <stdio.h> #include <stdlib.h> typedef struct _Node { int value; struct _Node * pLeft; struct _Node * pRight; } Node; Node * getNewNode(int iValue) { Node * p = (Node *)malloc(sizeof(Node)); if(NULL != p) { p->

一步一图一代码:排序二叉树

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值. ③它的左.右子树也都是排序二叉树. 添加操作: 当根节点为空时,添加进的节点作为根节点.然后每次添加节点时,都从根节点过滤,以根节点作为当前节点,如果新节点大于当前节点,则走当前节点的右子节点分支,如果新节点小于当前节点,则走当前节点的左子节点分支.然后再用右子节点

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

(eden)排序二叉树VS二叉树链表

排序二叉树 Description: If you have any doubt on this assignment, please send an email to its author 黎洋. --> 题目大意:请完成下面四个函数的定义(在tree.h文件中),使整个程序能够利用排序二叉树的结构对输入的数(不会出现相同的数),进行排序输出.节点的结构体在下面已给出,这个二叉树的特征是,左子数的值肯定比父节点小,右子树的值肯定比父节点的大.要求大家按照这个结构特征去构建二叉树,最后中序遍历输