问题 A: Red and Black(python)

问题 A: Red and Black(python),第1张

题目描述

一个矩形的房间铺着红色或者黑色的方砖。一个人站在红砖上不能移动,在黑砖上可以沿着上、下、左、右4个方向移动到相邻的方砖。请编写一个程序,计算从起点出发可以到达的黑色方砖的数量(包括起点在内)。
起点是@,要求:遍历所有黑砖。

输入

输入第一行是两个正整数W和H; W和H分别表示x方向和y方向上的方砖数量。W和H都是正整数并且不超过20.
接下来有H行,每行包含W个字符。每个字符表示方砖的颜色如下。
‘.’ - 黑砖
‘#’ - 红砖
‘@’ - 起点

输出

输出从起点出发可以到达的黑砖的数量(包括起点在内)。

样例输入 Copy

5 4
…#

#@…
.#…#

样例输出 Copy

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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/717157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存