算法基础之python实现枚举法中的讨厌的青蛙的问题
2018-03-10 17:20
661 查看
题目描述及要求:
解题思路:
程序代码:# -*- coding: utf-8 -*-
"""
Created on Fri Mar 9 16:47:05 2018
@author: lizihua
题目:小青蛙晚上会踩踏稻田,从而踩倒稻子,农民需要找到造成最大损害的那只青蛙的路径,
已知:每只青蛙总是沿一条直线跳跃稻田,每次跳跃距离相同(因此最少跳3步,才有间距!)
每只青蛙跳跃步长可能不同,方向也可能不同
青蛙每一跳都跳在水稻上,将水稻拍倒
"""
max=2
RC=input("请输入水稻的行数和列数:").split(' ')
RC = list(map(int, RC))
n=int(input("请输入被踩踏的水稻数目:"))
#输入被踩踏的水稻坐标
plants=[[0,0]]*n
plant=[0,0]
for i in range(n):
plants[i]=input("请输入第"+str(i+1)+"颗被踩踏的水稻的坐标:").split(' ')
plants[i]=list(map(int,plants[i]))
def searchpath(secplant,dx,dy):
plant[0]=secplant[0]+dx
plant[1]=secplant[1]+dy
steps=2
RC=[6,7]
while 1<=plant[0]<=RC[0] and 1<=plant[1]<=RC[1]:
if plant not in plants:
steps=0
break
plant[0]+=dx
plant[1]+=dy
steps+=1
return steps
#将被踩踏的水稻按坐标大小进行排序,先比较 x,若x相等,则比较y
plants=sorted(plants)
for i in range(n-2):
for j in range(i+1,n-1):
#选取plants[i]为第一个点,plants[j]为第二个点,求取间距dX 和 dY
dX=plants[j][0]-plants[i][0]
dY=plants[j][1]-plants[i][1]
#判断选取的第一个的前一个点的坐标是否在稻田里,
#若在,说明选取的步长太小,换第二个点再试
pX=plants[i][0]-dX
pY=plants[i][1]-dY
if 1<=pX<=RC[0] and 1<=pY<=RC[1]:
continue
#跳跃max步后,判断其在x方向是否过早越界,
#其中max是程序实时比较计算出的最大步数
#由于plants是排序过的,当这个点越界时,换第二个点时,dX增大,
#那么无论怎么换第二个点,都一定越界,因此,换第一个点再试
if plants[i][0]+(max-1)*dX >RC[0]:
break
#跳跃max步后,判断其在Y方向是否过早越界,
#由于plants是排序过的,换第二个点时,dX增大,但是dY减小
#因此,如果越界,则需换第二个点再试
pY=plants[i][1]+(max-1)*dY
if pY>RC[1] or pY<1:
continue
#走到这步则说明,该条路径不仅符合条件,而且跳跃步数比之前的max要大
#因此,计算该条路径的步数
steps=searchpath(plants[j],dX,dY)
if steps > max:
max=steps
if steps==2:
max=0
print(max)
程序结果显示:
解题思路:
程序代码:# -*- coding: utf-8 -*-
"""
Created on Fri Mar 9 16:47:05 2018
@author: lizihua
题目:小青蛙晚上会踩踏稻田,从而踩倒稻子,农民需要找到造成最大损害的那只青蛙的路径,
已知:每只青蛙总是沿一条直线跳跃稻田,每次跳跃距离相同(因此最少跳3步,才有间距!)
每只青蛙跳跃步长可能不同,方向也可能不同
青蛙每一跳都跳在水稻上,将水稻拍倒
"""
max=2
RC=input("请输入水稻的行数和列数:").split(' ')
RC = list(map(int, RC))
n=int(input("请输入被踩踏的水稻数目:"))
#输入被踩踏的水稻坐标
plants=[[0,0]]*n
plant=[0,0]
for i in range(n):
plants[i]=input("请输入第"+str(i+1)+"颗被踩踏的水稻的坐标:").split(' ')
plants[i]=list(map(int,plants[i]))
def searchpath(secplant,dx,dy):
plant[0]=secplant[0]+dx
plant[1]=secplant[1]+dy
steps=2
RC=[6,7]
while 1<=plant[0]<=RC[0] and 1<=plant[1]<=RC[1]:
if plant not in plants:
steps=0
break
plant[0]+=dx
plant[1]+=dy
steps+=1
return steps
#将被踩踏的水稻按坐标大小进行排序,先比较 x,若x相等,则比较y
plants=sorted(plants)
for i in range(n-2):
for j in range(i+1,n-1):
#选取plants[i]为第一个点,plants[j]为第二个点,求取间距dX 和 dY
dX=plants[j][0]-plants[i][0]
dY=plants[j][1]-plants[i][1]
#判断选取的第一个的前一个点的坐标是否在稻田里,
#若在,说明选取的步长太小,换第二个点再试
pX=plants[i][0]-dX
pY=plants[i][1]-dY
if 1<=pX<=RC[0] and 1<=pY<=RC[1]:
continue
#跳跃max步后,判断其在x方向是否过早越界,
#其中max是程序实时比较计算出的最大步数
#由于plants是排序过的,当这个点越界时,换第二个点时,dX增大,
#那么无论怎么换第二个点,都一定越界,因此,换第一个点再试
if plants[i][0]+(max-1)*dX >RC[0]:
break
#跳跃max步后,判断其在Y方向是否过早越界,
#由于plants是排序过的,换第二个点时,dX增大,但是dY减小
#因此,如果越界,则需换第二个点再试
pY=plants[i][1]+(max-1)*dY
if pY>RC[1] or pY<1:
continue
#走到这步则说明,该条路径不仅符合条件,而且跳跃步数比之前的max要大
#因此,计算该条路径的步数
steps=searchpath(plants[j],dX,dY)
if steps > max:
max=steps
if steps==2:
max=0
print(max)
程序结果显示:
相关文章推荐
- 算法基础之python实现枚举法中的熄灯问题
- 算法基础之python实现深度优先搜索中城堡问题
- 算法基础之python实现贪心算法中圣诞老人分糖果问题和二分查找算法中烘干衣服问题
- 算法基础之python实现贪心算法中的雷达安装问题和二分法中誊抄书籍问题
- 算法基础之python实现深度优先搜索的数独问题
- 算法基础之python实现递归法中棋盘分割问题
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 算法基础:整数拆分问题(Golang实现)
- 分组Top N问题(一) - java实现Top n算法基础
- python实现基础排序算法之(插入排序)
- <基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法
- 算法基础:排序(一)——选择排序、插入排序、Shell排序——Python实现
- 枚举-讨厌的青蛙(算法基础 第2周)
- 算法基础:排序(一)——选择排序、插入排序、Shell排序——Python实现
- Python 算法基础 排序实现
- 算法与数据结构基础系列(一): 链表的常见问题分析及实现
- 算法基础:排列组合问题-全排列(Golang实现)
- 《机器学习实战》——k-近邻算法Python实现问题记录
- python实现基础排序算法之(冒泡排序)
- python实现KNN算法中遇到的问题