DFS

边界都是1的最大正方形大小

http://www.nowcoder.com/questionTerminal/ac6dce3e0c254c7fab8e72b87e8946fa

n  = int(input())
M = []
for _ in range(n):
    M.append(list(map(int, input().split())))
max_len = 0

def dfs_r(x,y,max_r):  # 寻找右边界
    if y < n:
        if M[x][y] == 0:
            return max_r,y
        return dfs_r(x, y+1,max_r+1)
    else:
        return max_r,y-1
def dfs_b(x,y,max_b): # 寻找下边界
    if x < n:
        if M[x][y] == 0:
            return max_b,x
        return dfs_b(x+1,y,max_b+1)
    else:
        return max_b,x-1

for i in range(n):
    for j in range(n):
        if M[i][j] == 1: # 遍历得到右边界和下边界以及对应最长长度
            max_r,iy = dfs_r(i, j+1, 1)
            max_b,ix = dfs_b(i+1, j, 1)
        else:
            continue
        # 从得到的边界处继续寻找右边界和下边界,看能否构成完整的正方形
        if max_r >= max_b: # 取下边界和右边界中较小的作为正方形边长
            sub = max_r - max_b
            index = iy - sub # 较长的边界需要重新更新位置,右边长,更新右边界iy
            max_temp = max_b
            if dfs_r(ix, j+1, 1)[0] >= max_temp and dfs_b(i+1, index, 1)[0] >= max_temp: # 根据边界点继续向下向右找边界长度
                max_len = max(max_len,max_temp)
        else:
            sub = max_b - max_r
            index = ix - sub # 下边长,更新下边界ix
            max_temp = max_r 
            if dfs_r(index, j+1, 1)[0] >= max_temp and dfs_b(i+1, iy, 1)[0] >= max_temp:# 根据边界点继续向下向右找边界长度
                max_len = max(max_len,max_temp) # 得到最大边长
print(max_len)
全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务