【发布时间】:2011-12-14 11:07:30
【问题描述】:
是的,我正在学习 CS,并且已经完成了一个 C 实验室,一切进展顺利,但我现在遇到了一些似乎无法解决加分的问题。我已经做了一两天了,根本想不出一个正确的方法来完成这个。
简介
到目前为止的任务总结:
构建穿山甲游戏,计算机将问题和对象存储在树形结构中。游戏的工作原理如下:您想到一个对象,计算机通过询问您一系列“是/否”问题来尝试猜测您在想什么。如果计算机猜对了,它就赢了。如果你设法欺骗了它,你就赢了,但你必须向计算机提供一个问题,让它在下一轮正确猜测。仅此而已。
您最终得到的树结构示例(从左->右):
Tree
/
Is it made of wood?
\
Grass
/
Is it green?
\
Pangolin
/
Does it have a legs?
\
Computer
/
Is it larger than a microwave?
\
Laptop
/
Does it have a keyboard?
\
Desk
这是由以下结构组成的:
typedef struct node {
char* object_name; // object-name (which may be NULL)
char* question; // question (which may be NULL)
struct node *yesNode; // where if yes (NULL)
struct node *noNode; // where if no (NULL)
} node;
上面的树存储为以下文件:
Is it green?
Does it have a legs?
Does it have a keyboard?
Desk
Is it larger than a microwave?
Laptop
Computer
Pangolin
Is it made of wood?
Grass
Tree
问题
奖金如下:
让你的程序接受任意数量的输入文件,然后嫁接 他们一起组成一棵巨大的树。与朋友交换文件 并收集大量无意义的问题。正确地做到这一点 您需要扫描重复条目(您将无法执行此操作 完美,但它至少应该清除明显的重复项和 以合理的方式将树木嫁接在一起。)
或总结:
获取两个树结构(或表示树结构的文件)并将它们合并在一起以生成更大的树,同时删除重复项。
我的问题:
- 如何删除两棵未排序的树?
- 甚至可以在不手动检查每个节点的情况下删除重复项吗?
- 如何甚至循环到每个节点的底部并将其与另一棵树进行比较?
我最好的主意:
- 在第二棵树中搜索第一棵树中的对象
- 用穿山甲对象替换那些对象
- 在第一个中查找所有出现的穿山甲
- 改为将父级指向第二棵树的顶部
但这会破坏树结构,并可能导致游戏中断(比如第一棵树中的首要问题是它是红色的)并且第二棵树被附加到 no 节点上并且第二棵树中的所有项目都是红色的?
我的主要问题:
- 您知道如何解决这个问题吗?还是一种可行的hack?
- 您如何在两棵树中找到重复项?
- 如何将树木连接在一起?
- 如何循环遍历每棵树的底部?
【问题讨论】:
-
假设您和一个朋友各有一棵树,上面有一个问题和两个答案。假设你的是“它是用木头做的吗?”答案是“铅笔”和“汽车”,而你朋友的答案是“它比微波炉还大?” (“桌子”/“笔”)。我不知道您如何完全合并这些树。
-
我认为你们完全没有抓住重点!