python 样例 能过 全WA 求调 有注释
查看原帖
python 样例 能过 全WA 求调 有注释
1368189
znzryb楼主2024/7/16 21:59
# x,y,x是行数,y是列数,和传统认知是反的
# 本题思路是从外圈开始搜,把所有被洪水淹的地方都标记为‘1’,接着遍历输出0的个数
# 4 5
# 00000
# 00*00
# 0*0*0
# 00*00
# 经过一次外圈搜后
# 1 1 1 1 1
# 1 0 * 0 1
# 1 * 0 * 1
# 1 1 * 1 1
# 接着判断下一圈0周围是否有1即可判断是否应填充为1
import math

x,y=map(int,input().strip().split())
a=[]
for i in range(x):
    a.append(list(input().strip())) # 直接用list()就可以把‘0000*’变为['0','0','0','*']
n=math.ceil(min(x,y)/2)  # 这个搜索次数n是由min(x,y)决定的

# 先将外圈搜一遍
for i in range(y): # 搜上面和下面
    if a[0][i] != '*':
        a[0][i] = '1'
    if a[x-1][i] != '*':
        a[x-1][i] ='1'
for i in range(1,x-1):  # 搜左边和右边
    if a[i][0] != '*':
        a[i][0] = '1'
    if a[i][y-1] != '*':
        a[i][y-1] = '1'

for i in range(1,n):
    for j in range(y-2*i):  # 搜内圈
        #搜上面,判断此格是否与其他洪水格子联通,顺序为本格上下左右(逻辑为只要不是*且上下左右中有一格为1,该格子与洪水连通,记‘1’)
        if a[i][j+i] !='*' and (a[i-1][j+i]=='1' or a[i+1][j+i]=='1' or a[i][j+i-1]=='1' or a[i][j+i+1]=='1'): 
            a[i][j+i]='1'
        #搜下面,逻辑同上,将i(纵坐标)替换为x-i-1即可
        if a[x-i-1][j+i] !='*' and (a[x-i-1-1][j+i]=='1' or a[x-i+1-1][j+i]=='1' or a[x-i-1][j+i-1]=='1' or a[x-i-1][j+i+1]=='1'): 
            a[x-i-1][j+i]='1' 
    for j in range(x-2*i):
        #搜左面,把i替换为i+j,j+i替换为i
        if a[i+j][i] !='*' and (a[i+j-1][i]=='1' or a[i+j+1][i]=='1' or a[i+j][i-1]=='1' or a[i+j][i+1]=='1'): 
            a[i+j][i]='1'
        #搜右面,把i(横坐标)替换为y-i-1
        if a[i+j][y-i-1] !='*' and (a[i+j-1][y-i-1]=='1' or a[i+j+1][y-i-1]=='1' or a[i+j][y-i-1-1]=='1' or a[i+j][y-i+1-1]=='1'): 
            a[i+j][y-i]='1'

# 遍历列表,输出即可
ans=0
for i in range(x):
    for j in range(y):
        if a[i][j]=='0':
            ans+=1
print(ans)
2024/7/16 21:59
加载中...