鱼C论坛

 找回密码
 立即注册
查看: 2639|回复: 36

[已解决]Python:每日一题 327

[复制链接]
发表于 2020-2-8 19:23:04 | 显示全部楼层 |阅读模式
50鱼币
今天的题目:


给定一个二维数组,代表地图。
其中 'S' 表示起点,'T' 表示终点。'#' 代表墙壁,无法通过,'.' 表示普通的路,需要花一分钟时间通过。

求从起点到终点需要花费的最短时间(以分钟为单位)。如果无法到达终点则输出 -1。

示例 1:

输入:
[
  ['S', '.'],
  ['#', 'T']
]
输出:2
解释:S --> . --> 向右转,走到 T。


欢迎大家一起答题!
最佳答案
2020-2-8 19:23:05
本帖最后由 William4869 于 2020-2-8 22:37 编辑
  1. def f327(x):
  2.     dp=[[]for i in range(len(x))]
  3.     que=[[]]
  4.     gox=[1,0,-1,0]
  5.     goy=[0,1,0,-1]
  6.     for i in range(len(x)):
  7.         for j in range(len(x[0])):
  8.             dp[i].append(-1)
  9.             if x[i][j]=='S':
  10.                 dp[i][j]=0
  11.                 que[0].append(i)
  12.                 que[0].append(j)
  13.             if x[i][j]=='T':
  14.                 retx=i
  15.                 rety=j
  16.     while len(que):
  17.         p=que.pop(0)
  18.         if p[0]==retx and p[1]==rety:
  19.             break
  20.         for i in range(4):
  21.             nx=p[0]+gox[i]
  22.             ny=p[1]+goy[i]
  23.             if nx>=0 and nx<len(x) and ny>=0 and ny<len(x[0])\
  24.                and x[nx][ny]!='#' and \
  25.                (dp[nx][ny]>(dp[p[0]][p[1]]+1)or dp[nx][ny]==-1) :
  26.                 que.append([nx,ny])
  27.                 dp[nx][ny]=dp[p[0]][p[1]]+1
  28.    # print(dp)
  29.     return dp[retx][rety]
复制代码


BFS搜索,,,应该没什么问题

最佳答案

查看完整内容

BFS搜索,,,应该没什么问题

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 19:23:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 William4869 于 2020-2-8 22:37 编辑
  1. def f327(x):
  2.     dp=[[]for i in range(len(x))]
  3.     que=[[]]
  4.     gox=[1,0,-1,0]
  5.     goy=[0,1,0,-1]
  6.     for i in range(len(x)):
  7.         for j in range(len(x[0])):
  8.             dp[i].append(-1)
  9.             if x[i][j]=='S':
  10.                 dp[i][j]=0
  11.                 que[0].append(i)
  12.                 que[0].append(j)
  13.             if x[i][j]=='T':
  14.                 retx=i
  15.                 rety=j
  16.     while len(que):
  17.         p=que.pop(0)
  18.         if p[0]==retx and p[1]==rety:
  19.             break
  20.         for i in range(4):
  21.             nx=p[0]+gox[i]
  22.             ny=p[1]+goy[i]
  23.             if nx>=0 and nx<len(x) and ny>=0 and ny<len(x[0])\
  24.                and x[nx][ny]!='#' and \
  25.                (dp[nx][ny]>(dp[p[0]][p[1]]+1)or dp[nx][ny]==-1) :
  26.                 que.append([nx,ny])
  27.                 dp[nx][ny]=dp[p[0]][p[1]]+1
  28.    # print(dp)
  29.     return dp[retx][rety]
复制代码


BFS搜索,,,应该没什么问题

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 19:37:04 | 显示全部楼层
能不能给多点示例?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 20:20:46 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-2-8 20:33 编辑

最短路径搜索啊,我想一想。
话说,有地图循环的设计吗?
比如:
  1. 输入:
  2.         [['S','#','T']]
  3. 输出:
  4.         1
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 20:33:39 | 显示全部楼层
本帖最后由 塔利班 于 2020-2-8 20:38 编辑
  1. def f327(x):
  2.     a,b=len(x),len(x[0])
  3.     def dp(i,j,s,l):
  4.         if i in range(a) and j in range(b):
  5.             if x[i][j] in l:
  6.                 return a*b
  7.             else:
  8.                 l.add((i,j))
  9.             if x[i][j]=='T':
  10.                 return s
  11.             elif x[i][j] in 'S.':
  12.                 ps={(i+1,j),(i-1,j),(i,j+1),(i,j-1)}
  13.                 return min([dp(ii,jj,s+1,l.copy()) for ii,jj in ps-l])
  14.             else:
  15.                 return a*b
  16.         else:
  17.             return a*b

  18.     for i in range(a):
  19.         for j in range(b):
  20.             if x[i][j]=='S':
  21.                 res=dp(i,j,0,set())
  22.                 return -1 if res>=a*b else res
复制代码

最近有点愚笨,先来踩雷

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 20:52:17 | 显示全部楼层
本帖最后由 Croper 于 2020-2-8 21:22 编辑

A*算法
  1. class SortedList(list):
  2.     def __init__(self,key=lambda x:x):
  3.         super().__init__();
  4.         self.key=key
  5.         self.reversed=reversed
  6.         
  7.     def append(self,ele):
  8.         p,q=0,len(self)
  9.         while p<q:
  10.             n=(p+q)//2
  11.             if self.key(ele)>self.key(self[n]):
  12.                 q=n
  13.             else:
  14.                 p=n+1
  15.         super().insert(p,ele)

  16. def func327(map):
  17.     if len(map)==0 or len(map[0])==0:
  18.         return -1;
  19.     start_pos=target_pos=None;
  20.     for i in range(len(map)):
  21.         for j in range(len(map[i])):
  22.             if map[i][j]=='S':
  23.                 map[i][j]=0
  24.                 start_pos=(i,j)
  25.             if map[i][j]=='T':
  26.                 target_pos=(i,j)


  27.     def valid(pos:tuple):
  28.         return 0<=pos[0]<len(map) and 0<=pos[1]<len(map[pos[0]])

  29.     offset=((1,0),(-1,0),(0,1),(0,-1))
  30.     inner=[]
  31.     outer=SortedList(key=lambda x:abs(x[0]-target_pos[0])+abs(x[1]-target_pos[1])+map[x[0]][x[1]])

  32.     outer.append(start_pos)

  33.     while len(outer)>0:
  34.         #printl2(map)
  35.         #print()
  36.         #for i in outer:
  37.             #print(map[i[0]][i[1]],end=" ")
  38.         #print()
  39.         #time.sleep(0.5)
  40.         pos=outer.pop();
  41.         inner.append(pos)
  42.         n=map[pos[0]][pos[1]]

  43.         for i in range(4):
  44.             y,x=pos[0]+offset[i][0],pos[1]+offset[i][1]
  45.             if valid((y,x)):
  46.                 if (y,x) in inner:
  47.                     continue
  48.                 c=map[y][x]
  49.                 if c=='T':
  50.                     return n+1
  51.                 if c=='.':
  52.                     map[y][x]=n+1
  53.                     outer.append((y,x))
  54.                
  55.     return -1
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 21:16:42 | 显示全部楼层
前排占个楼。已有思路,11点前调试发送
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 21:37:06 | 显示全部楼层
可以多给几个样例调试吗,写的差不多了,不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 21:42:25 | 显示全部楼层
最小路径算法。。。。。。当初学java的时候最头疼这玩意了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 21:56:21 | 显示全部楼层
阴阳神万物主 发表于 2020-2-8 20:20
最短路径搜索啊,我想一想。
话说,有地图循环的设计吗?
比如:

输出 -1,不是 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 21:58:44 | 显示全部楼层
塔利班 发表于 2020-2-8 20:33
最近有点愚笨,先来踩雷

输入 [['.', 'T', '.', 'S', '.', '#', '.', '.', '.', '.'], ['#', '.', '.', '.', '.', '#', '.', '#', '.', '.'], ['.', '.', '.', '.', '.', '.', '#', '.', '.', '#'], ['.', '.', '.', '.', '#', '#', '.', '.', '.', '.'], ['#', '#', '.', '.', '.', '.', '.', '#', '.', '#']] 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 22:01:32 | 显示全部楼层
zltzlt 发表于 2020-2-8 21:58
输入 [['.', 'T', '.', 'S', '.', '#', '.', '.', '.', '.'], ['#', '.', '.', '.', '.', '#', '.', '#', ...

  1. def f327(x):
  2.     a,b=len(x),len(x[0])
  3.     def dp(i,j,s,l):
  4.         if i in range(a) and j in range(b):
  5.             if x[i][j] in l:
  6.                 return a*b
  7.             else:
  8.                 l.add((i,j))
  9.             if x[i][j]=='T':
  10.                 return s
  11.             elif x[i][j] in 'S.':
  12.                 ps={(i+1,j),(i-1,j),(i,j+1),(i,j-1)}
  13.                 return min([dp(ii,jj,s+1,l.copy()) for ii,jj in ps-l]+[a*b])
  14.             else:
  15.                 return a*b
  16.         else:
  17.             return a*b

  18.     for i in range(a):
  19.         for j in range(b):
  20.             if x[i][j]=='S':
  21.                 res=dp(i,j,0,set())
  22.                 return -1 if res>=a*b else res
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 22:01:40 | 显示全部楼层

输入:
  1. [['.', '#', '.', '.', '#', '.', '.', '.', '.', '#', '.', '#'], ['.', '.', '.', '.', '#', '.', '#', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '#', '#', '#', '#', '#', 'S', '.', '.'], ['#', '#', '.', '#', '.', '#', '.', '.', '#', '#', '.', '.'], ['.', '#', '.', '.', '.', '#', '#', '#', '.', '#', '#', '.'], ['.', '.', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '#', '.', '#', '#', '#', '.', '.', '.', '.', '.'], ['.', '#', '.', '#', '#', '#', '.', '#', '.', '#', '.', '.'], ['#', '.', '.', '.', '#', '.', '.', '#', '.', '#', '#', '.'], ['.', '.', '#', '#', '#', '.', '#', '#', '.', '.', '.', '.'], ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.', '#', '.'], ['.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#', '.'], ['#', '.', '.', '.', '#', '.', '#', '.', '.', '.', '#', '#'], ['#', '.', '#', '#', '#', 'T', '.', '#', '#', '.', '.', '#'], ['.', '#', '#', '#', '.', '#', '.', '.', '.', '#', '.', '.'], ['#', '.', '.', '.', '.', '#', '.', '#', '#', '.', '.', '.']]
复制代码

输出:23
预期结果:21
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 22:03:04 | 显示全部楼层
William4869 发表于 2020-2-8 21:50
BFS搜索,,,应该没什么问题

解答错误

输入:
  1. [['.', '#', '.', '#', '#', '.'], ['.', '#', 'S', '.', '#', '.'], ['.', '#', '.', '#', '#', '#'], ['.', '.', '#', '.', '#', '.'], ['.', '.', '.', '.', '.', '.'], ['.', '#', 'T', '.', '.', '.']]
复制代码

输出:99999
预期结果:-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 22:04:53 | 显示全部楼层
学到零基础35课时,表示题目看不懂。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 22:06:15 | 显示全部楼层

输入以下数据超时:

  1. [['.', '.', '#', '#', '.', '#', '#', '.', '#', '#'], ['#', '.', '.', '#', '.', '.', '.', '#', '#', '#'], ['.', '.', '.', '.', '.', '.', '.', '#', '#', '#'], ['.', '#', '#', '.', '#', '.', '.', '.', '.', '#'], ['.', '.', '#', '#', '.', '.', '#', '#', '#', '.'], ['.', '.', '#', '.', '.', '#', '.', '.', '.', '.'], ['.', '.', '#', '.', '.', '.', '#', '.', '.', '.'], ['#', '.', '.', '.', '.', '#', '.', '.', '.', '#'], ['.', '.', '.', 'S', 'T', '.', '.', '#', '.', '.'], ['.', '.', '.', '#', '.', '#', '.', '#', '#', '.'], ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 22:07:49 | 显示全部楼层
本帖最后由 William4869 于 2020-2-9 22:30 编辑
William4869 发表于 2020-2-8 21:50
BFS搜索,,,应该没什么问题


说一下大概步骤,先整一个同样大小的矩阵,值置为-1,S那一点的值置为0,T的横纵坐标先保存

对输入的二维数组x 从S开始用BFS搜索
之前先定义好了gox,goy,代表了下一步会怎么走,每一个点开始有4种走法,要是下一点可以走,并且没有访问过,让点进队,那个点对应的dp值置为上一步的值+1,直到搜到T点位置,
本来想整一个visit数组的,后来想想,只要遇到的数字不比本身数字大1以上,就是没访问过的点了,

再仔细想想,好像值为-1就是没访问过得点,程序也懒得改了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 22:08:17 | 显示全部楼层
楼主测测吧,可能超时
  1. def fun327(path_map):
  2.     #x是行号 y是列号
  3.     M = len(path_map)
  4.     N = len(path_map[0])
  5.     path_possible = []#所有的'.'
  6.     for x in range(0,M):
  7.         for y in range(0,N):
  8.             if path_map[x][y] == '.':
  9.                 path_possible.append((x,y))
  10.             elif path_map[x][y] == 'S':
  11.                 S = (x,y)
  12.             elif path_map[x][y] == 'T':
  13.                 T = (x,y)
  14.     index = 1            
  15.     tempset={S}#最低步数为index-1的 坐标集合
  16.     path_possible.append(T)#终点也加入

  17.     while True:
  18.         mySet = set()
  19.         for centerPoint in tempset:
  20.             if centerPoint[0] > 0:#up
  21.                 tempPoint = (centerPoint[0] - 1,centerPoint[1])
  22.                 if tempPoint in path_possible:
  23.                     mySet.add(tempPoint)
  24.                     path_possible.remove(tempPoint)
  25.             
  26.             if centerPoint[0] < M - 1:#down
  27.                 tempPoint = (centerPoint[0] + 1,centerPoint[1])
  28.                 if tempPoint in path_possible:
  29.                     mySet.add(tempPoint)
  30.                     path_possible.remove(tempPoint)

  31.             if centerPoint[1] > 0:#left
  32.                 tempPoint = (centerPoint[0],centerPoint[1] - 1)
  33.                 if tempPoint in path_possible:
  34.                     mySet.add(tempPoint)
  35.                     path_possible.remove(tempPoint)

  36.             if centerPoint[1] < N - 1:#right
  37.                 tempPoint = (centerPoint[0],centerPoint[1] + 1)
  38.                 if tempPoint in path_possible:
  39.                     mySet.add(tempPoint)
  40.                     path_possible.remove(tempPoint)

  41.         if T in mySet:
  42.             return index
  43.         elif mySet == set():
  44.             return -1
  45.         else:
  46.             index = index + 1
  47.             tempset = mySet
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-8 22:09:49 | 显示全部楼层
TJBEST 发表于 2020-2-8 22:08
楼主测测吧,可能超时

确实会超时哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-8 22:10:44 | 显示全部楼层

数对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表