MOOC数据结构与算法Python版-第十二周编程作业

1 先修课(10分)

题目内容:

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

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

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

 

输入格式:

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

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

 

输出格式:

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

 

输入样例:

2

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

 

输出样例:

False

 

参考代码模板:

 

  1. def canFinish(self, n, pre):
  2.     # code here
  3.     pass
  4.  
  5. n = int(input())
  6. pre = eval(input())
  7. print(canFinish(n, pre))

程序代码:

# 思想:该方法的每一步总是输出当前无前趋(即入度为零)的顶点

def canFinish(n, pre):
    # 课程的长度
    clen = len(pre)
    if clen == 0:
        # 没有课程,当然可以完成课程的学习
        return True

    # 步骤1:统计每个顶点的入度
    # 入度数组,记录了指向它的结点的个数,一开始全部为 0
    in_degrees = [0 for _ in range(n)]
    # 邻接表,使用散列表是为了去重
    adj = [set() for _ in range(n)]

    # 想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
    # [0, 1] 表示 1 在先,0 在后
    # 注意:邻接表存放的是后继 successor 结点的集合
    for second, first in pre:
        in_degrees[second] += 1
        adj[first].add(second)

    # 步骤2:拓扑排序开始之前,先把所有入度为 0 的结点加入到一个队列中
    # 首先遍历一遍,把所有入度为 0 的结点都加入队列
    queue = []
    for i in range(n):
        if in_degrees[i] == 0:
            queue.append(i)

    counter = 0
    while queue:
        top = queue.pop(0)
        counter += 1
        # 步骤3:把这个结点的所有后继结点的入度减去 1,如果发现入度为 0 ,就马上添加到队列中
        for successor in adj[top]:
            in_degrees[successor] -= 1
            if in_degrees[successor] == 0:
                queue.append(successor)

    return counter == n

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

时间限制:500ms内存限制:32000kb

程序代码:

def countServers(grid):
    ROW, COL = len(grid), len(grid[0])
    crow = [0] * ROW
    ccol = [0] * COL
    for i in range(ROW):
        for j in range(COL):
            if grid[i][j]:
                crow[i] += 1
                ccol[j] += 1

    res = 0
    for i in range(ROW):
        for j in range(COL):
            res += grid[i][j] and (crow[i] > 1 or ccol[j] > 1)
    return res

grid = eval(input())
print(countServers(grid))

 

你可能感兴趣的:(Python,数据结构)