L2-048 寻宝图 - 团体程序设计天梯赛-练习集 (pintia.cn)
dfs模板
样例4 1分超时拿不到
样例6 不开最大递归深度过不了
import sys
sys.setrecursionlimit(10000000)
N,M=map(int,input().split())
dp=[[0 for i in range(M)] for _ in range(N)]
nm=[]
for _ in range(N):
nm.append(list(map(int,list((input())))))
xy=[[1,0],[0,1],[-1,0],[0,-1]]
cnt1=0
cnt2=0
sign = 0
def dfs(x,y):
global sign
dp[x][y] = 1
if nm[x ][y ] > 1:
sign=1
for a in xy:
dx=a[0]
dy=a[1]
if not (0<=x+dx<N and 0<=y+dy<M):
continue
if dp[x+dx][y+dy]==0:
if nm[x + dx][y + dy] >= 1:
dp[x+dx][y+dy]=1
dfs(x+dx,y+dy)
for x in range(N):
for y in range(M):
if nm[x][y] > 0 and dp[x][y] == 0:
dfs(x, y)
cnt1 += 1
if sign == 1:
cnt2 += 1
sign = 0
print(cnt1, cnt2)
优化记录数组成集合
拿下了那个超时的数据
import sys
sys.setrecursionlimit(10000000)
N, M = map(int, input().split())
visit = set()
nm = []
for _ in range(N):
nm.append(list(map(int, list((input())))))
xy = [[1, 0], [0, 1], [-1, 0], [0, -1]]
cnt1 = 0
cnt2 = 0
sign = 0
def dfs(x, y):
global sign
visit.add(x* M+y)##每一个i,j对应了一个i*m+j
if nm[x][y] > 1:
sign = 1
for a in xy:
dx = a[0]
dy = a[1]
if not (0 <= x + dx < N and 0 <= y + dy < M):
continue
if (x + dx)*M+(y + dy) not in visit:
if nm[x + dx][y + dy] >= 1:
dfs(x + dx, y + dy)
for x in range(N):
for y in range(M):
if nm[x][y] > 0 and (x*M+y not in visit):
dfs(x, y)
cnt1 += 1
if sign == 1:
cnt2 += 1
sign = 0
print(cnt1, cnt2)