06-图2 Saving James Bond - Easy Version(Python)——(7)

整体思路:使用邻接矩阵,使用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()

提交结果如下:
在这里插入图片描述
最小跳部分,不知道怎么改进程序,希望大家能提醒下我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值