整体思路:使用邻接矩阵,使用DFS
把邻接矩阵的(0,0)当作坐标原点,1-N当作N个鳄鱼是否有边, N+1当作岸边。
在实现过程中,主要是对鳄鱼和岸边的图的生成。
在生成图函数geneGraph中,由三个部分:第一跳,鳄鱼之间,鳄鱼到岸边。
调用DFS时,使用flag当作是否可以逃生的标志。
具体代码如下:
#使用邻接矩阵计算
#定义邻接矩阵和访问矩阵
ListMat = [[0]*101 for i in range(102)]
VisitMat = [0]*101
#记录鳄鱼的坐标位置
CordlX = [0]*101
CordlY = [0]*101
flag = 0
#主函数
def main():
#读取第一行数据
Num = list(map(int,input().split()))
#对两个矩阵进行初始化
#initMat(Num[0])
#把符合距离的鳄鱼添加边
geneGraph(Num[0],Num[1])
#进行广度优先搜索
ErgDFS(Num[0])
"""
#初始化函数
def initMat(N):
for i in range(N+2):
VisitMat[i] = 0
for j in range(N+2):
ListMat[i][j] = 0
"""
#生成图函数,把邻接矩阵中的点变为1
#Dots 鳄鱼的数量,Distance:跳跃的距离
def geneGraph(Dots, Distance):
#存储每个鳄鱼的位置
for i in range(1,Dots+1):
Point = list(map(int,input().split()))
CordlX[i] = Point[0]
CordlY[i] = Point[1]
#判断能否从中心跳到鳄鱼上
for i in range(1,Dots+1):
if(pow((7.5+Distance),2) > (pow(CordlY[i],2) + pow(CordlX[i],2))):
ListMat[0][i] = 1
ListMat[i][0] = 1
#判断能否从一条鳄鱼跳到其他鳄鱼上
for i in range(1,Dots+1):
for j in range(i, Dots+1):
if (pow(Distance, 2) > (pow(CordlX[i]-CordlX[j], 2) + pow(CordlY[i]-CordlY[j], 2))):
ListMat[i][j] = 1
ListMat[j][i] = 1
#判断能否上岸
for i in range(1,Dots+1):
if ((50 - max(CordlX[i],CordlY[i]) <= Distance)) or (50 + min(CordlX[i],CordlY[i]) <= Distance):
ListMat[Dots+1][i] = 1
ListMat[i][Dots+1] = 1
#广度优先搜索
def ErgDFS(Dots):
global flag
for i in range(1,Dots+1):
#是否可以跳
if (ListMat[0][i] == 1 and VisitMat[i] == 0):
DFS(i, Dots)
if flag == 1:
print("Yes")
else:
print("No")
def DFS(i, Dots):
global flag
VisitMat[i] = 1
#每次迭代检测是否可以上岸
if (ListMat[Dots+1][i] == 1):
flag = 1
return
for j in range(1, Dots+1):
if (ListMat[i][j] == 1 and VisitMat[j] == 0):
VisitMat[j]= 1
DFS(j, Dots)
if __name__ == "__main__":
main()
提交结果如下:
最小跳部分,不知道怎么改进程序,希望大家能提醒下我。