Pyrhon矩阵问题的解决方法

先看题目:

给出一个 n × m 的地图,上面有 k 对好朋友,分别用 'a','A','b','B', … …表示。其中大写字母 'A' 和小写字母 'a' 是一对好朋友。

小写字母在单位时间内可以向上、向下、向左或向右移动一格(可以穿过障碍物),大写字母不能移动。

请问最快找到好朋友(对应的大写字母)的小写字母是谁?

输入数据

第一行有一个整数 t (1 ≤ t ≤ 100) ,表示有 t 组数据。

对于每组数据:

第一行有三个正整数 n , m, k (1 ≤ n,m ≤ 100, 1 ≤ k ≤ 26) ,表示地图的行数、列数和好朋友的对数;

接下来有 n 行,每行有一个长为 m 的字符串,表示地图。 '.' 表示什么都没有,对应的大写字母和小写字母表示一对好朋友。

输出数据

输出 t 行,每行一个小写字母,表示最快找到好朋友的小写字母。

扫描二维码关注公众号,回复: 1652826 查看本文章

如果有多个小写字母同时找到好朋友,则输出字典序最小的小写字母。

样例输入

3
2 5 2
aBA..
....b
3 4 3
a..A
b.B.
c.C.
4 4 2
b..A
.B..
....
...a

样例输出

a
b
b

  1. 解决思路
  2. 源码
  3. 更优秀的思路

1.题目要求两个大小写字母的距离,只要是’隔壁‘就算是找到朋友了。所以,我把它们想象成坐标的形式,横坐标相减取绝对值,纵坐标相减取绝对值,相加。最近的就是和最小的那个,这样写成一个函数,输入是26字母中的一个,还有一个list,通过行列信息把列表位置转换成坐标位置。主函数就是在把26个字母循环遍历。这样结果就出来了。
2.源码:
def abd(x,y,z):#x输入是二十六个大写字母中的一个y是列表 z是行列信息
    if x in y:
        x_i=y.index(x)
        print(x_i,int(z[1]))
        x_x=x_i//int(z[1])
        x_y=x_i%int(z[1])
        x1 = chr(ord(x)+32)
        x1_i = y.index(x1)
        x1_x = x1_i //int(z[1])
        x1_y = x1_i % int(z[1])
        anser = abs(x1_x-x_x)+abs(x1_y-x_y)#以坐标差算距离
        return anser
    else:
        return 100
zs = int(input());ana = []
for i in range(zs):
    a = list(input().split())#输入矩阵信息
    d=[]
    for ii1 in range(int(a[0])):
        d += list(input())#输入第一行
    e=[]
    for ii in range(65,97):
        xx=abd(chr(ii),d,a)
        e.append(xx)#返回26个字母的距离列表
    an=e.index(min(e))
    bn=list(range(97,123))
    bn1=chr(bn[an])
    ana.append(bn1)
for iii in ana:
    print(iii)
3.别人对这个题目的想法与思路
几乎没有用到矩阵的,可能是没有必要?


猜你喜欢

转载自blog.csdn.net/tommy1295/article/details/80603808
今日推荐