这个算法怎么实现???谢谢!!100分!!着急!!!
在事先知道性别的情况下,A B C D E是五个人,他们是一家人,A是B的丈夫,A是C和D的父亲,A是E的儿子,这里都是以A为基点,怎么样通过算法,我们知道以E为基点的时候,E是A的母亲,E是B的母亲,E是C和D的奶奶;又怎样知道以C为基点,C是A和B的儿子,C是E的孙子,C是D的兄弟\
或者在不写程序的时候,可以通过数据库的表结构实现???
不知道说没说清楚,请大家指教,谢谢!!
问题点数:100、回复次数:26Top
1 楼def000()回复于 2006-07-28 00:43:33 得分 0
数据库好像叫做存储过程?
比如你用下面的类表示人
class person
{
person* m_spouse;
list<person*> m_parents;
list<person*> m_children;
//结婚
void Marry(person* spouse)
{
m_spouse = spouse; spouse->m_spouse = this;
// 你的父母和他的父母都是你们的父母
m_parents = m_parents + spouse->m_parents;
m_spouse->m_parents = m_parents;
// 你的孩子和他的孩子都是你们的孩子
m_children = m_children + spouse->m_childern
m_spouse->m_children = m_children;
// 这样你和你配偶的就都搞定了,还得更新你们所有孩子和父母的相应的关系。。。
// 太多了。
}
};Top
2 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 08:36:40 得分 0
这个好象不行,还有更好的吗??
各位大哥!!!Top
3 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 08:41:08 得分 0
请强人指教Top
4 楼AFIC(A Fool In China)回复于 2006-07-28 09:44:10 得分 0
一看你的例子就坐不出来,
你说:A是B的丈夫,A是E的儿子,E是B的母亲
你这里存在近亲结婚了,这就存在双重人际关系了,
ab是夫妻也是兄妹,b是e的女儿兼儿媳妇
这不是算法能解决的了,如果多重近亲结婚肯定是死循环。
如果是你笔误那么以小家庭为单位建立一个id,
并记录其双亲家庭的id,
然后再加上一个家庭中的辈分,
利用oracle特有的connect with查询一下基本上就可以搞定。Top
5 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 10:59:22 得分 0
大哥,那就叫婆婆吧,E是B的婆婆
能不能说的细一点Top
6 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 11:00:16 得分 0
能不能不用ORACLE
用代码能实现吗Top
7 楼wood87654321(wood87654321)回复于 2006-07-28 15:15:26 得分 0
你的问题条件是特定的?也就是说肯定针对那5个人以及那样固定的关系?
还是可扩展的?也就是说算法在新增加姐妹、舅舅等等情况下也要适用?Top
8 楼AFIC(A Fool In China)回复于 2006-07-28 16:01:05 得分 0
你首先要存放你已知的信息对巴,
就按我说的建表结构,
id/homeid/phomeid/level
比如a
a/1/0/2
b/1/0/2
c/2/1/1
d/3/1/1
e/0/x/3
这就是你例子的数据
第一个id就是名字
第二个根据家庭的不同,我随便递增的
第三是父母家庭id,
e是a的母亲,e的家庭id是0,所以a的phomeid也是0
这样你的数据就穿起来了。
第四个表示辈分,e最老是3,其次是ab,是2。
当你想知道,C为基点,C是A的什么的时候,
先看辈分,a大,差距是1,你就直接取出c的phomeid,
有亲子关系自然家庭号相同,否则没关系。
这不是很自然,很简单吗?
不过辈分差距不是1的时候你就要循环操作了。Top
9 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 19:35:10 得分 0
当然不是特定的,要扩展
不过,一些太特殊的我们可以归为其他亲戚就好了
常用的是必须的Top
10 楼cxt460()回复于 2006-07-28 22:02:32 得分 0
AFIC感觉还是有一点小瑕疵也Top
11 楼wood87654321(wood87654321)回复于 2006-07-31 09:24:56 得分 0
用表结构是比较现实的方法,但是由于条件是可扩展的,所以建立数据结构时,必须事先建立所有要用亲戚之间的对应关系表。
AFIC(AFIC)的结构体现了辈分关系,但无法体现实际的亲缘关系,比如同一家庭上一辈,其究竟是父还是母?抑或是姑舅等“其他亲戚”?Top
12 楼AFIC(A Fool In China)回复于 2006-07-31 09:57:49 得分 0
我觉得可以实现就没写那么细而以……
他已经说了他有性别了阿。
姑舅肯定是他的phomeid的phomeid和姑舅的phomeid相同吧,
sorry,我不知道姑舅到底是什么亲戚……Top
13 楼chszs(老刀)回复于 2006-07-31 13:29:55 得分 0
建立树状结构最清晰。Top
14 楼DraculaW(成爲牛人,然後離開)回复于 2006-08-03 10:44:04 得分 0
樹狀結構 最好使用臨接矩陣 這樣子實現得最清晰Top
15 楼kingkiosk()回复于 2006-08-08 10:55:40 得分 0
其实复杂的问题可以拆成几个简单的问题
建立几个关系
1.个人资料 (编号,姓名,性别等)
2.夫妻关系的 (丈夫编号,妻子编号)
3.辈分关系的 (父母编号,儿女编号)
然后给他们编号,用编号做主键就连接成一个关系数据库.
找儿女通过数据库表3找,找孙子的话先在3找儿女,确定儿女号后再在3找一次儿女
找兄弟的话先找父(母)编号,然后通过父(母)找该父(母)名下所有子女,除掉你自己就是兄弟
找婆婆的话先找出配偶编号,通过找配偶的父母确定两个编号,然后在1确定性别知道是婆婆还是公公Top
16 楼kingkiosk()回复于 2006-08-08 14:20:37 得分 0
用数据结构的话
1.个人资料用结构体数组放
2.可以选用顺序表来放
3.可以通过关系画出一个森林,再转成二叉树存放Top
17 楼jammyxu()回复于 2006-08-08 14:38:08 得分 0
就五个字段搞定,其它用存储过程算
名字,性别,父,母,配偶Top
18 楼yyfhz(火山)回复于 2006-08-08 17:34:53 得分 0
定义所有需要用到的关系:
如
父,母,子,女,兄,弟,姐,妹,
祖父,祖母,外祖父,外祖母,
夫,妻,
岳父,岳母,公公,婆婆,...
找出其中最基本的关系,如
父,母,子,女,夫,兄,弟,姐,妹,
然后以这些基本关系来定义其他的关系
如
祖父= 父(父)
妻= 夫的反函数
岳母=母(妻)=母(夫的反函数)
...
然后将关系树中的任意两点都用这种基本关系的叠加来表示出来,再通过这些关系式转换即可。Top
19 楼kingkiosk()回复于 2006-08-09 00:47:40 得分 0
反函数?Top
20 楼kingkiosk()回复于 2006-08-09 01:02:17 得分 0
这样吧
用一个一维数组表示人名
A[][2]={(父亲名,男),(母亲名,女),(老婆名,女),(姐姐名,女),...}
A数组的行标当做这个人的编号,
用一个二维数组定义夫妻关系
S[][2]={(编号1,编号2),(编号3,编号4),...}
如:姐姐编号是3,姐夫编号是8
那么
S[0][0]=3;S[0][1]=8
同一行标的人为夫妻,也就是说通过扫描这个二维数组就可以知道所有的夫妻关系
用一棵二叉树表示辈分和兄弟姐妹关系,关系规则:左孩子右兄弟(姐妹)
父亲
我 叔叔
我儿子 我弟弟 叔叔的孩子1 伯伯
我女儿 弟弟的孩子 叔叔的孩子2 伯伯的孩子Top
21 楼yyfhz(火山)回复于 2006-08-09 09:25:22 得分 0
可以用图来表示最基本成员关系,在连线上记录2个成员之间的关系。
如
夫 妻
|------------------------------------------|
| |
父 子 |父 子 子 母| 女 父
AA'--------------- A --------------- C ------------------------ B -------------BA'
夫| | | 兄 | | | |夫
妻| | | | | | |妻
AB'---------------| | | | |-------------BB'
母 子 | 妹 | | 女 母
|--------------- D ------------------------|
|父 女 | 女 母|
| |姐 |
| | |
| | |
| |弟 |
|--------------- E ------------------------|
父 子 子 母
对于任意2个成员,找出它们之间的最短路径,
然后可以根据间接关系的推导公式求出各个成员之间的关系。
Top
22 楼jammyxu()回复于 2006-08-09 14:08:21 得分 0
其实只要表示一代直系亲属关系就好了,多了反而更复杂
所以我只用五个字段,但考虑到夫妻有离婚的问题,加一个婚姻表,即一个子女表,一个婚姻表:
表一:
名字,性别,父,母
表二:
男方名,女方名,离婚否(靠!加个索引的话,一夫多妻,二奶都好表示!)
你的兄弟姐妹:查询你同一个父亲或同一个母亲的人(可查同父异母或同母异父,同父同母则将或改为与)
你的奶奶:查询你父亲的母亲
你的岳母(婆婆):查询你配偶的母亲,考虑离婚情况:你子女的外婆(奶奶),同名过小滤一下
任何血綠关系都逃不出以上关系。结拜,收养关系当然不算血綠关系了
Top
23 楼kingkiosk()回复于 2006-08-09 17:13:47 得分 0
楼上你给那是在关系数据库上实现的
现在要的是数据结构的算法Top
24 楼yelling(Ray(←☆→射手))回复于 2006-08-10 14:29:11 得分 0
其实只需要建一个合理的数据结构就可以了。
一种设想是:
可以引用二叉树的结构,父亲为根节点,子女位子节点,可以建好一棵二叉树,然后,父亲和母亲之间有一个双向指针,用来模拟夫妻关系。
这种模型的问题是,碰到离过婚的话,就不好处理,但是在数据结构上较简单。
另一种方法是:
每一个节点有两个父节点,就是父亲和母亲,这样的模型能够处理上面的问题,但是建树和遍历树的时候比较麻烦。
暂时想到两种,只是原型,没做优化。。。Top
25 楼kingkiosk()回复于 2006-08-10 23:14:25 得分 0
楼上的想法很好
其实只要树的数据域有两个字符串就行了Top
26 楼yelling(Ray(←☆→射手))回复于 2006-08-11 09:53:30 得分 0
那样不行的,因为,夫妻可以离婚再结的Top




