数据结构与算法Python版第十二周OJ作业

1 先修课(10分)

题目内容:

有 n 门课程要选,其编号分别由 0 至 n-1

每个课程都有一些需要提前学完的先修课程:例如,假设在学习课程 0 前需要先学习课程 1 ,我们用一个先修关系对[0, 1]来表示这种 “后学习课程,先修课程” 的关系

现给定一系列课程与若干先修关系,请判断是否存在一个方案可以学完所有课程

输入格式:

输入分为两行,第一行为一个整数,表示课程的总数

第二行为一个嵌套列表的Python表达式,包含若干先修关系对

输出格式:

True或False,表示是否存在一个按照先修关系学完所有课程的顺序

输入样例:

2

[[1,0],[0,1]]

输出样例:

False

解题思路:

判断是否存在一个按照先修关系学完所有课程的顺序就是判断课程依赖关系图中是否不存在圈,先用一个列表存储每个课程是哪些课程先修课程,用一个递归算法来判断从图中任意顶点出发是否存在圈,递归运算过程中记录已经访问过的课程和当前路径中的课程,如果当前路径中的课程出现重复说明出现了圈,如果遇到已经访问过但不在当前路径中的课程可以直接跳过从而加速递归运算。

程序代码:

def canFinish(n, pre):
    if n == 0:
        return False
    graph = [[] for _ in range(n)]
    for sub in pre:
        graph[sub[1]].append(sub[0])

    def isCircle(N):
        visited.append(N)
        if N in path:
            return True
        path.append(N)
        keys = graph[N]
        if keys == []:
            return False
        for key in keys:
            if key in visited and key not in path:
                continue
            if isCircle(key):
                return True
            path.pop()
        else:
            return False

    i = 0
    while i < n:
        visited = []
        path = []
        if isCircle(i):
            return False
        i += 1
    else:
        return True


n = int(input())
pre = eval(input())
print(canFinish(n, pre))

2 联网的服务器(10分)

题目内容:

给定一个二维列表表示的地图,其中每个位置值为 1 或 0 ;1 代表该位置存在一个服务器,0 代表该位置为空。对每个服务器来说,如果其所在的位置同一行或同一列有其它服务器,就称这个服务器是“联网”的。

请求出地图上所有联网的服务器的总数。

输入格式:

一行,为一个以合法Python表达式给出的二维嵌套列表

输出格式:

一行整数

输入样例:

[[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]

输出样例:

4

解题思路:

用两个列表分别存储每一行和每一列各有多少台服务器,当发现当前位置存在服务器时,就到列表中查看该服务器的行和列上是否存在其他服务器。

程序代码:

def netSum():
    x_list = [0] * len(list)
    y_list = [0] * len(list[0])
    count = 0
    for i in range(len(list)):
        for j in range(len(list[0])):
            if list[i][j] == 1:
                x_list[i] += 1
                y_list[j] += 1
    for i in range(len(list)):
        for j in range(len(list[0])):
            if list[i][j] == 1:
                if x_list[i] >= 2 or y_list[j] >= 2:
                    count += 1

    return count


list = eval(input())
print(netSum())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值