一个矩形的房间铺着红色或者黑色的方砖。一个人站在红砖上不能移动,在黑砖上可以沿着上、下、左、右4个方向移动到相邻的方砖。请编写一个程序,计算从起点出发可以到达的黑色方砖的数量(包括起点在内)。
起点是@,要求:遍历所有黑砖。
输入第一行是两个正整数W和H; W和H分别表示x方向和y方向上的方砖数量。W和H都是正整数并且不超过20.
接下来有H行,每行包含W个字符。每个字符表示方砖的颜色如下。
‘.’ - 黑砖
‘#’ - 红砖
‘@’ - 起点
输出从起点出发可以到达的黑砖的数量(包括起点在内)。
样例输入 Copy5 4
…#
…
#@…
.#…#
15
第一个是广搜版
class Queue:
def __init__(self,size = 100):
self.queue = [0 for _ in range(size)]
self.size = size
self.rear = 0 #队尾
self.front = 0 #队首
def push(self,element):
if not self.is_filled():
self.rear = (self.rear+1) % self.size
self.queue[self.rear] = element
else:
raise IndexError("Queue is filled")
def pop(self):
if not self.is_empty():
self.front = (self.front + 1) % self.size
return self.queue[self.front]
else:
raise IndexError("Queue is empty!")
#判断队空
def is_empty(self):
return self.rear==self.front
# 判断队满
def is_filled(self):
return (self.rear+1)%self.size==self.front
#1 red and black
#定义全局变量
mp=[]
num,w,h=0,0,0
dir = [(0,-1),(-1,0),(0,1),(1,0)]
#读入地图数据
w,h = map(int,input().split())
start = [0,0] #起始位置
for i in range(h):
row = list(input())
mp.append(row)
for j in range(len(row)):
if mp[i][j]=="@":
start=[i,j]
q = Queue()
q.push(start)
num=1
#队列循坏,只要队列非空
while not q.is_empty():
pt = q.pop() #出队
#沿着左上右下的方向进行搜索
for i in range(4):
new_x = pt[0]+dir[i][0]
new_y = pt[1] + dir[i][1]
if 0<=new_x<h and 0<=new_y<w and mp[new_x][new_y]==".":
num+=1 #找到数量加1
q.push([new_x,new_y])
mp[new_x][new_y] = "#" #标记当前位置为红砖,避免重复搜索
print(num)
下面这个是深搜版
#1 red and black 深搜版
#定义全局变量
mp=[]
num,w,h=0,0,0
dir = [(0,-1),(-1,0),(0,1),(1,0)]
def dfs(r,c):
global mp,num,w,h,dir
for i in range(4):
nr=r+dir[i][0]
nc=c+dir[i][1]
if 0<=nr<h and 0<=nc<w and mp[nr][nc]==".":
num+=1
mp[nr][nc]="#"
dfs(nr,nc)
#读入地图数据
w,h = map(int,input().split())
start = [0,0] #起始位置
for i in range(h):
row = list(input())
mp.append(row)
for j in range(len(row)):
if mp[i][j]=="@":
start=[i,j]
num=1
dfs(start[0],start[1])
print(num)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)