第一行输入两个整数
——纸张的行数与列数。
接下来
行,每行输入一个长度为
的由 `'.'` 与 `'*'` 组成的字符串,描述残缺纸张的形状:
`'.'` 代表该方格已被剪去;
`'*'` 代表该方格仍保留。
输出一个整数,表示被剪下来的图案中长方形的数量。
4 10 *.*.*...** ...***.*.. .**..*.*.. *..*****..
4
可以看出,图中恰有一个正方形,三个长方形,共计四个长方形。
import sys from collections import deque for line in sys.stdin: data = line.split() n = int(data[0]) m = int(data[1]) break mat = [] for line in sys.stdin: data = line.split() mat.append(data[0]) direction = [(1,0),(-1,0),(0,1),(0,-1)] flag = [[0 for _ in range(m)] for _ in range(n)] def check(i,j): if_rectangle = 1 temp = deque() temp.append([i,j]) flag[i][j] = 1 u = i d = i l = j r = j while temp: now = temp.popleft() for dir in direction: x = now[0] + dir[0] y = now[1] + dir[1] if 0<=x<n and 0<=y<m and mat[x][y]=='.' and flag[x][y]==0: temp.append([x,y]) flag[x][y] = 1 # 每更新一个点就更新边界 u = min(u,x) d = max(d,x) l = min(l,y) r = max(r,y) # 检查边界内部是否有'*' for i in range(u, d+1): for j in range(l, r+1): if mat[i][j] =='*': if_rectangle = 0 return if_rectangle count = 0 for i in range(n): for j in range(m): if mat[i][j] == '.' and flag[i][j] == 0: count += check(i,j) print(count)