bvac

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
# 找明星问题
# 10个人中只有一个明星,大家都认识明星,明星不认识任何人。

from random import randrange

#直接法,两两判断
def naive_celeb(G):
    n = len(G)
    for u in range(n):
        for v in range(n):
            if u == v: continue
            if G[u][v]: break
            if not G[v][u]: break
        else:
            return u

#优化思路:G[u][v]为真,说明u肯定不是明星,否则v肯定不是明星
def celeb(G):
    u,v = 0,1
    n = len(G)
    for c in range(2,n+1): #从第3个开始 以次判断
        if G[u][v]:  #如果u认识v,则u肯定不是明星,往后累加
            u = c
        else:
            v = c #否则u可能是明星,v肯定不是明星,往后累加
    if u == n: #累加到最后,只剩下u和v,u不是明星,说明v是明星
        c = v
    else:
        c = u

    #其实到这里已经能确定c就是明星了,下面的过程再判断一遍

    for v in range(n):
        if c == v:
            continue
        if G[c][v]: break
        if not G[v][c]: break
    else:
        return c
    return None


n = 10 #人数

# 构造数据结构,使用二维数组
G = [[randrange(2) for i in range(10)] for i in range(10)]

c = randrange(10) # 指定一位明星
print(c)

#设置关系
for i in range(10):
    G[i][c] = True #所有人都认识明星
    G[c][i] = False #明星不认识所有人

for i in G:
    print(i)

cc = naive_celeb(G)
print(cc)

cc = celeb(G)
print(cc)
posted on 2017-02-09 16:31  bvac  阅读(330)  评论(0编辑  收藏  举报