1. 长草
解答代码
from collections import deque #双头队列
m,n = map(int,input().split())
mat=[]
q = deque() #定义一个队列
dire = {(0,1),(0,-1),(1,0),(-1,0)}
for i in range(m):
mat.append(list(input())) #注意此处的输入用法,append() + list(input())
k = int(input())
for i in range(m):
for j in range(n):
if mat[i][j]=='g':
q.append((i,j)) # 在队列右方添加一个元素
def bfs():
t = len(q)
while t>0:
temp = q.popleft() # 从队列左方删除一个元素,将已经长草的弹出
x,y = temp[0],temp[1]
for dx,dy in dire:
lx = x+dx
ly = y+dy
if lx>=0 and ly>=0 and lx<m and ly<n and mat[lx][ly]=='.':
mat[lx][ly]='g'
q.append((lx,ly)) # 将新长草的位置存起来
t -= 1 # 别忘了这一句!
for i in range(k):
bfs() # 每一个月长一次草
for i in range(m):
print(''.join(mat[i]))
2. 大胖子走迷宫
解答代码:
from collections import deque
m,k = map(int,input().split())
mat = [list(input()) for i in range(m)]
q = deque()
q.append((2,2,2,0))
M=[[0]*m for i in range(m)]
M[2][2]=1
def f(step):
if step<k:
return 2
if step<2*k:
return 1
else:
return 0
def check(x,y,z): # 检查小明身体所占的面积内有没有障碍物
for i in range(x-z,x+z+1):
for j in range(y-z,y+z+1):
if mat[i][j]=='*':
return False
return True
def bfs():
while q:
x,y,z,step = q.popleft()
if x==m-3 and y==m-3:
return step
if z!=0:
q.append((x,y,f(step+1),step+1)) # 这条表示小明停留在原地不走,可以等到体积变为1之后再走
for dx,dy in [(0,1),(0,-1),(1,0),(-1,0)]:
lx = x+dx
ly = y+dy
if lx-z<0 or lx+z>=m or ly-z<0 or ly+z>=m:
continue
if M[lx][ly]==1:
continue
if check(lx,ly,z)==False:
continue
q.append((lx,ly,f(step+1),step+1))
M[lx][ly]=1
print(bfs())
3. 作物杂交
解答代码:
import os
import sys
N,M,K,T=map(int,input().split())#map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
#print(M)
#print(type(M))
growtime=list(map(int,input().split()))#map()的返回值已经不再是list,而是iterators, 所以想要使用,只用将iterator 转换成list 即可, 比如 list(map()) 。
#print(growtime)
growtime.insert(0, 0)#从1号位置开始
existeed=list(map(int,input().split()))#已有的种子
relation=[list(map(int,input().split())) for i in range(K)]#每有一个交配方案就有一行输入
parents=[[] for i in range(N+1)]
for element in relation:
a=[element[0],element[1],max(growtime[element[0]],growtime[element[1]])]
parents[element[2]].append(a)#t号种子,双亲1,双亲2,双亲培育t号的时间print(parents)
dp=[float('inf') for i in range(N+1)]#所有种子的培育时间全都设为无穷大
for i in existeed:#已有的种子,培育时间改为0
dp[i]=0
def dns(t):
if dp[t]!=float('inf'):#
return dp[t]
for x in parents[t]:
dp[t]=min(dp[t],max(dns(x[0]),dns(x[1]))+x[2])#
#任意一个种子,其培育时间为培育其双亲的时间中取最大+其双亲成熟的时间取最大,具有累加效应;如果双亲都是已有种子,则只有其双亲成熟的时间取最大;
#如果双亲培育时间未知,则带入dns(t)中计算,往上追述双亲,直至最后双亲都是已有种子,最后得到双亲培育时间。
#因为一个品种可能由好几种培育方案,意思是说parents[t]中的x项不止一个,第一个dp[t]计算出来了,然后第二项利用min()将选出最短的培育时间
return dp[t]
print(dns(T))
3. 全球变暖
题目描述
你有一张某海域 NxN 像素的照片,".“表示海洋、”#"表示陆地,如下所示:
…....
.##…
.##…
…##.
…####.
…###.
…....
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…....
…....
…....
…....
…#…
…....
…....
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入描述
第一行包含一个整数 N (1≤N≤1000)。
以下 N 行 N 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出描述
输出一个整数表示答案。
样例输入
7
.......
.##....
.##....
....##.
..####.
...###.
.......
样例输出
1
显然这是一个连通性问题。步骤是:
1.遍历一个连通块(找到这个连通块中所有的’#‘,并标记已经搜过,不用再搜);
2.再遍历下一个连通块…;
3.遍历完所有连通块,统计有多少个连通块。
import os
import sys
# 请在此输入您的代码
#用 DFS 或 BFS 搜出有多少个岛(连通块),检查这个岛有没有高地,统计那些没有高地
#的岛(连通块)的数量,就是答案。
n=int(input())
a=[]
for i in range(n):
a.append(input())
vis=[[0]*n for i in range(n)] #记录是否访问过的数组
dir=[(0,1),(0,-1),(1,0),(-1,0)] #记录左右下上四个方向
flag=True
q=[] #用列表来实现队列
def bfs(x,y):
global flag
q.append((x,y))
vis[x][y]=1
while len(q):
item=q.pop(0) #将队列中第一个元素出队
tx=item[0]
ty=item[1]
if a[tx][ty+1]=='#' and a[tx][ty-1]=='#' and a[tx+1][ty]=='#' and a[tx-1][ty]=='#':
flag=False #这是一个高地,不会被淹没
for i in range(4):
nx=tx+dir[i][0]
ny=ty+dir[i][1]
if vis[nx][ny]==0 and a[nx][ny]=='#':
vis[nx][ny]=1
q.append((nx,ny))
ans=0
for i in range(n):
for j in range(n):
if a[i][j]=='#' and vis[i][j]==0:
flag=True #假设这个岛被淹
bfs(i,j) #找这个岛中有没有高地,如果有flag为True
if flag:ans+=1 #会被淹没的岛数量加1
print(ans)