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())