先看题目:
给出一个 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 行,每行一个小写字母,表示最快找到好朋友的小写字母。
如果有多个小写字母同时找到好朋友,则输出字典序最小的小写字母。
样例输入
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.题目要求两个大小写字母的距离,只要是’隔壁‘就算是找到朋友了。所以,我把它们想象成坐标的形式,横坐标相减取绝对值,纵坐标相减取绝对值,相加。最近的就是和最小的那个,这样写成一个函数,输入是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.别人对这个题目的想法与思路
几乎没有用到矩阵的,可能是没有必要?