1113.红与黑

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。

在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出格式

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围

1W,H201≤W,H≤20

输入样例:

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

输出样例:

45
# from queue import Queue
# while 1:
#     ans=1
#     m,n=map(int,input().split())
#     if n==0 and m==0:
#         break
#     a=[input() for i in range(n)]
#     v=[[0]*m for i in range(n)]
#     for i in range(n):
#         for j in range(m):
#             if a[i][j]=='@':sx,sy=i,j
#     v[sx][sy]=1
#     q=Queue()
#     q.put([sx,sy])
#     dx,dy=[0,0,1,-1],[1,-1,0,0]
#     while q.qsize():
#         x,y=q.get()
#         for i in range(4):
#             xx,yy=x+dx[i],y+dy[i]
#             if xx<0 or xx>=n or yy<0 or yy>=m or v[xx][yy] or a[xx][yy]=='#':continue
#             v[xx][yy]=1
#             ans+=1
#             q.put([xx,yy])
    
#     print(ans)


from collections import deque


maze = []
st = 0

def bfs():
    queue = deque()
    queue.append(st)
    cnt = 0
    while queue:
        x,y = queue.popleft()
        for nx,ny in [(x + 1,y),(x - 1,y),(x,y + 1),(x,y - 1)]:
            if 0 <= nx < h and 0 <= ny < w:
                if maze[nx][ny] != '#':
                    maze[nx][ny] = '#'
                    queue.append((nx,ny))
                    cnt += 1
    return cnt if cnt != 0 else 1

while True:
    w,h = map(int,input().split())
    if w == 0 and h == 0:break

    for i in range(h):
        hi = list(input())
        if '@' in hi:
            st = (i,hi.index('@'))#这里的确是先放i虽然i是y但是i是行数即二维数组的第一个数,bfs里也是用x和h判界的
        maze.append(hi)
    print(bfs())
    maze.clear()
posted @ 2022-06-02 11:08  束时  阅读(15)  评论(0)    收藏  举报