当前位置:   article > 正文

华为OD机试真题:欢乐的周末_华为od机试多少算通过

华为od机试多少算通过

 题目描述

小华和小为是很要好的朋友,他们约定周末一起吃饭。

通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?


输入描述

第一行输入m和n,m代表地图的长度,n代表地图的宽度。

第二行开始具体输入地图信息,地图信息包含:

0 为通畅的道路

1 为障碍物(且仅1为障碍物)

2 为小华或者小为,地图中必定有且仅有2个 (非障碍物)

3 为被选中的聚餐地点(非障碍物)


输出描述

可以被两方都到达的聚餐地点数量,行末无空格。

示例1  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4 4

2 1 0 3

0 1 2 1

0 3 0 0

0 0 0 0

输出

2

说明

第一行输入地图的长宽为3和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

此时两者能都能到达的聚餐位置有2处。

示例2  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4 4

2 1 2 3

0 1 0 0

0 1 0 0

0 1 0 0

输出

0

说明

第一行输入地图的长宽为4和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

由于图中小华和小为之间有个阻隔,此时,没有两人都能到达的聚餐地址,故而返回0。

备注:

地图的长宽为m和n,其中:

4 <= m <= 100

4 <= n <= 100

聚餐的地点数量为 k,则

1< k <= 100

  1. #解题想法:把每个人可能到达的地点全部用dfs求出,再通过原来的l中目的地为3和这两个人是否
  2. 都能到达来获取结果
  3. 测试用例:
  4. 4 4
  5. 2 1 0 3
  6. 0 1 2 1
  7. 0 3 2 0
  8. 0 1 0 0
  9. while 1:
  10. try:
  11. import copy
  12. m, n = input().split(" ")
  13. m = int(m)
  14. n = int(n)
  15. l = []
  16. for _ in range(m):
  17. s = list(map(int, input().split()))
  18. l.append(s)
  19. #深度赋值l,因为dfs函数会改变传入参数ll的值,所以用一个复制一个
  20. l1= copy.deepcopy(l)
  21. l2 =copy.deepcopy(l)
  22. tmp=[]
  23. for i in range(m):
  24. for j in range(n):
  25. if l[i][j]==2:
  26. tmp.append([i,j])
  27. res1 = [[0] * m for _ in range(n)]
  28. res2 = [[0] * m for _ in range(n)]
  29. px=[-1,0,1,0]
  30. py=[0,-1,0,1]
  31. def dfs(ll,res,i,j,flag):
  32. for index in range(0,len(px)):
  33. new_x=i+px[index]
  34. new_y = j + py[index]
  35. if new_x<m and new_x>=0 and new_y<n and new_y>=0 and ll[new_x][new_y]!=1 and not flag:
  36. ll[new_x][new_y]=1
  37. res[new_x][new_y]=1
  38. dfs(ll,res,new_x,new_y,flag)
  39. ll[new_x][new_y]=0
  40. flag = False
  41. dfs(l1,res1,tmp[0][0],tmp[0][1],flag)
  42. flag = False
  43. dfs(l2, res2, tmp[1][0], tmp[1][1], flag)
  44. print("初始条件")
  45. for line1 in l:
  46. print(line1)
  47. print("第一个人可到达的路线")
  48. for line2 in res1:
  49. print(line2)
  50. print("第二个人可到达的路线")
  51. for line3 in res2:
  52. print(line3)
  53. result=0
  54. for i in range(m):
  55. for j in range(n):
  56. if l[i][j] == 3 and res1[i][j]==1 and res2[i][j]==1:
  57. result+=1
  58. print()
  59. print("result:",result)
  60. except:
  61. break

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/522343
推荐阅读
相关标签
  

闽ICP备14008679号