天津科技大学第六届科技文化节算法设计大赛第21题
题目:
对于一个字母矩阵,我们称矩阵中的一个三升序列是指在矩阵中找到三个字母,它们在 同一行,同一列,或者在同一 45 度的斜线上,这三个字母从左向右看、或者从上向下看是 递增的。 例如,如下矩阵中 YQPD BKEZ AFYV 有 BKZ、BEZ、AFY、AFV、AKP、DEF 等 6 个三升序列。注意当三个字母是从左下到右上排 列时,从左向右看和从上向下看是不同的顺序。 对于下面的 30 行 50 列的矩阵,请问总共有多少个三升序列?
解题思路:
可以转化成4个矩阵,分别为原矩阵,原矩阵的转置矩阵,将原矩阵顺时针旋转45°得到的矩阵,将原矩阵逆时针旋转45°得到的矩阵,将这四个矩阵的每一行使用itertools中的combinations函数进行组合,将符合条件的序列计数
源代码
from itertools import combinations
martrix='VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX'
martrix=martrix.split(" ")
martrix1=[]#原矩阵
martrix2=[]#转置矩阵
martrix3=[]#左上到右下
martrix4=[]#右上到左下
for i in martrix: #形成字符串矩阵
i=list(i)
martrix1.append(i)
for i in range(len(martrix1[0])): #原矩阵转置
temp = []
# 数组的第一维维度
for j in range(len(martrix1)):
temp.append(martrix1[j][i])
martrix2.append(temp)
for i in range(-50,31,1):
temp=0
martrix3.append([])
for j in (0,80):
for k in (0,50):
if i+j==k:
print(i,j,k)
martrix3[-1].append(martrix1[j][k])
for i in range(0,21):
martrix4.append([])
temp=0
for j in (0,len(martrix1)):
for k in (0,len(martrix1[j])):
if i-j==k:
martrix4[temp].append(martrix1[j][k])
num=0
for i in martrix1:
for j in combinations(i, 3):
if j[0] < j[1] < j[2]:
num += 1
for i in martrix2:
for j in combinations(i, 3):
if j[0] < j[1] < j[2]:
num += 1
for i in martrix3:
for j in combinations(i, 3):
if j[0] < j[1] < j[2]:
num += 1
for i in martrix4:
for j in combinations(i, 3):
if j[0] < j[1] < j[2]:
num += 1
print(num)
结果
180414