路径查找算法练习和使用 .txt 文件

Path finding algorithm excercise and working with .txt files

这是给我的作业,我一直在努力写解决方案。

编写一个程序,找出矩阵(二维网格)中最长的相邻颜色序列。颜色由“R”、“G”、“B”字符(分别为红色、绿色和蓝色)表示。
您将获得 4 个单独的测试用例,它们也必须包含在您的解决方案中。
您的解决方案根目录示例应如下所示:

solutionRootDir
| - (my solution files and folders)
| - tests/
| - test_1
| - test_2
| - test_3
| - test_4

  1. 单个测试用例输入格式:

test_1
Provided input:
3 3
R R B
G G R
R B G
Expected Output:
2

test_2
Provided input:
4 4
R R R G
G B R G
R G G G
G G B B
Expected Output:
7

test_3
Provided input:
6 6
R R B B B B
B R B B G B
B G G B R B
B B R B G B
R B R B R B
R B B B G B
Expected Output: 22

test_4
Provided input:
1000 1000
1000 rows of 1000 R’s
Expected Output:
1000000

  1. 您的程序入口点应接受一到四个附加参数。 这些参数将指示您的程序应该 运行.
  2. 的测试用例的名称

• 示例 1:./myprogram test_1 test_3

• 示例 2:./myprogram test_1 test_2 test_3 test_4

• 您可以假设用户的输入是正确的(不需要验证)

import numpy as np

a = int(input("Enter rows: "))
b = int(input("Enter columns: "))
rgb = ["R", "G", "B"]
T = [[0 for col in range(b)] for row in range(a)]

for row in range(a):
    for col in range(b):
        T[row][col] = np.random.choice(rgb)

for r in T:
    for c in r:
        print(c, end=" ")
    print()

def solution(t):
    rows: int = len(t)
    cols: int = len(t[0])
    longest = np.empty((rows, cols))
    longest_sean = 1

    for i in range(rows - 1, -1, -1):
        for j in range(cols - 1, -1, -1):
            target = t[i][j]

            current = 1

            for ii in range(i, rows):
                for jj in range(j, cols):
                    length = 1
                    if target == t[ii][jj]:
                        length += longest[ii][jj]
                    current = max(current, length)

            longest[i][j] = current
            longest_sean = max(current, longest_sean)

    return longest_sean

print(solution(T))

为了从控制台执行中获取参数,您必须使用 sys.argv 所以 from sys import argv。而不是将您的文本字段转换为 python 这样的列表

def load(file):
    with open(file+".txt") as f:
        data = f.readlines()
    res = []
    for row in data:
        res.append([])
        for element in row:
            if element != "\n" and element != " ":
                res[-1].append(element)

    return res

将创建一个包含 "R""B""G" 的二维列表。而不是您可以像使用此函数一样简单地查找一个值的最长区域:

def findLargest(data):
    visited = []
    area = []
    length = 0
    movement = [(1,0), (0,1), (-1,0),(0,-1)]

    def recScan(x, y, scanArea):
        visited.append((x,y))
        scanArea.append((x,y))
        
        for dx, dy in movement:
            newX, newY = x+dx, y+dy
            if newX >= 0 and newY >= 0 and newX < len(data) and newY < len(data[newX]):
                if data[x][y] == data[newX][newY] and (not (newX, newY) in visited):
                    recScan(newX, newY, scanArea)
        return scanArea
            

    for x in range(len(data)):
        for y in range(len(data[x])):
            if (x, y) not in visited:
                newArea = recScan(x, y, [])
                if len(newArea) > length:
                    length = len(newArea)
                    area = newArea
    return length, area

由此 recScan 将检查所有未访问 jet 的相邻字段。而不是像这样调用函数:

if __name__ == "__main__":
    for file in argv[1:]:
        data = load(file)
        print(findLargest(data))

argv[1:] 是必需的,因为传递给 python 的第一个参数是您要执行的文件。我的数据结构是。

main.py
test_1.txt
test_2.txt
test_3.txt
test_4.txt

和 test_1 抛出 test_4 看起来像这样只是其他值。


R R B B B B
B R B B G B
B G G B R B
B B R B G B
R B R B R B
R B B B G B