【问题标题】:Python 2D List Complete Search Optimization ProblemPython 2D 列表完整搜索优化问题
【发布时间】:2021-08-25 01:50:30
【问题描述】:

我目前正在处理 USACO 问题,最近遇到了障碍。我的程序可以按照问题要求做,只是不在指定的时间限制内,我认为大约是 4 秒。

问题如下:

Bessie 是一名忙碌的计算机科学研究生。然而,即使是研究生也需要朋友。结果,农夫约翰开辟了一个牧场,其明确目的是帮助贝西和其他奶牛建立持久的友谊。 Farmer John 的牧场可以看作是一个由方形“细胞”组成的大型 2D 网格(想象一个巨大的棋盘)。每个单元格都标有:

  • 'C' 如果单元格包含牛。
  • 'G' 如果单元格包含草。
  • '.'如果单元格既不包含牛也不包含草。

要让两只截然不同的奶牛成为朋友,奶牛必须选择在与它们直接水平或垂直相邻的草地覆盖的广场相遇。在这个过程中,他们吃草覆盖的广场上的草,所以未来的奶牛不能把那个广场作为交汇点。同一头母牛可能会与不止一头母牛成为朋友,但没有一对母牛会多次相遇并成为朋友。

农夫约翰希望随着时间的推移,无数对奶牛会相遇并成为朋友。请确定本次体验结束时可能在不同奶牛对之间建立的新友谊的最大数量。

输入格式(输入来自终端/标准输入): 第一行包含 N 和 M (N,M≤1000)。 接下来的 N 行每行包含一串 M 个字符,描述牧场。

输出格式(打印输出到终端/标准输出): 计算体验结束时可以成为朋友的奶牛对的最大数量。

样本输入:

4 5
.CGGC
.CGCG
CGCG.
.CC.C

样本输出:

4

如果我们用坐标 (i,j) 标记第 i 行和第 j 列中的奶牛,那么在这个例子中,奶牛位于 (1,2), (1,5), (2,2), (2 ,4)、(3,1)、(3,3)、(4,2)、(4,3) 和 (4,5)。四对牛成为朋友的一种方式如下:

(2,2) 和 (3,3) 处的奶牛吃 (3,2) 处的草。 (2,2) 和 (2,4) 处的奶牛吃 (2,3) 处的草。 (2,4) 和 (3,3) 处的奶牛吃 (3,4) 处的草。 (2,4) 和 (1,5) 处的奶牛在 (2,5) 处吃草。

我的程序:

line = input().strip().split()
n,m = int(line[0]),int(line[1])
grid = []
for i in range(n):
    line = input().strip()
    grid.append([i for i in line])

friends = []

for i in range(len(grid)):
  for j in range(len(grid[i])):
    if grid[i][j] == 'G':
      grid[i][j] = '.'
      pair = []
      for k in [[0,1], [0,-1], [1,0], [-1,0]]:
        if i+k[0] > -1 and j+k[0] > -1 and i+k[0] < n and j+k[1] < m:
          if grid[i+k[0]][j+k[1]] == 'C':
            pair.append((i+k[0], j+k[1]))
          if len(pair) == 2 and (pair[0], pair[1]) not in friends and (pair[1], pair[0]) not in friends:
            friends.append(tuple(pair))
            break

print(len(friends))

如果您使用测试数据运行我的代码,您会发现它有效。但是当给定一个巨大的输入集时,比如每行有 1000 行和 1000 个字符,它就无法高速执行。有谁知道我可以如何优化我的代码?

请注意,对于这个问题,我只能使用python 已经附带的库,例如itertoolstkinter。 (只是示例库,我不会在这样的问题中使用tkinter。)

【问题讨论】:

    标签: python matrix optimization


    【解决方案1】:

    使friends 成为一个集合而不是一个列表,这样in friends 的检查是O(1) 而不是O(|friends|)。

    【讨论】:

      【解决方案2】:

      原来我的逻辑是错误的。我的工作计划:

      line = input().strip().split()
      n, m = int(line[0]), int(line[1])
      grid = [list(input().strip()) for i in range(n)]
      pos = [[1,0], [-1,0], [0,1], [0,-1]]
      friends = set()
      ans = 0
      
      def count_neighbors(i,j):
        global ans
        nbrs = []
        for x in pos:
          if 0 <= i+x[0] < n and 0 <= j+x[1] < m:
            if grid[i+x[0]][j+x[1]] == 'C':
              nbrs.append((i+x[0], j+x[1]))
        if len(nbrs) == 2 and (nbrs[1], nbrs[0]) not in friends:
            friends.add(tuple(nbrs))
        elif len(nbrs) > 2:
          ans += 1
      
      for i in range(len(grid)):
        for j in range(len(grid[i])):
          if grid[i][j] == 'G':
            count_neighbors(i,j)
      print(len(friends) + ans)
      

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        相关资源
        最近更新 更多