最大相连男生数/学生方阵

题目描述

学校组织活动, 将学生排成一个矩形方阵.

请在矩形方阵中找到最大的位置相连的男生数量.

这个相连位置在一个直线上, 方向可以是水平的, 垂直的, 成对角线的或者呈反对角线的.

注: 学生个数不会超过10000

输入描述

输入的第一行为矩阵的行数和列数, 接下来的n行为矩阵元素, 元素间用,分隔.

输出描述

输出一个整数, 表示矩阵中最长的位置相连的男生个数.

示例1

输入:

3,4
F,M,M,F
F,M,M,F
F,F,F,M

输出:

3

说明:

draw1

题解

Python

def main():
    # 读取输入
    # 然后遍历二维数组中的所有节点, 找到 "M", 然后基于此, 向四个方向移动, 找到最长的连续队列
    rows, columns = map(int, input().split(","))
    assert 0 < rows and 0 < columns and rows * columns < 10000
    table = [list(input().split(",")) for _row in range(rows)]
    assert len(table[0]) == columns

    MAN = "M"
    WOMEN = "W"

    # 当前节点可以连接最多男生的数量
    count_list = []
    
    # 查找的四个方向, 向右/向下/右下角/左下角
    directions = ((1, 0), (0, 1), (1, 1), (-1, 1))

    def get_max_male_student(x, y, count_list):
        # 遍历所有方向
        for dx, dy in directions:
            x2 = x + dx
            y2 = y + dy
            # 男学生的数量
            count = 1

            # 按当前方向一直查找
            # 1. 新的坐标在队列内
            # 2. 新的位置是男生
            while 0 <= x2 < rows and 0 <= y2 < columns and table[x2][y2] == MAN:
                x2 += dx
                y2 += dy
                count += 1

            count_list.append(count)

    # 遍历所有节点
    for row in range(rows):
        for column in range(columns):
            # 如果当前节点是位男生, 就递归地找最长连续序列
            if table[row][column] == MAN:
                get_max_male_student(row, column, count_list)

    # 打印结果
    print(max(count_list))

if __name__ == "__main__":
    main()