21. 三升序列

天津科技大学第六届科技文化节算法设计大赛第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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值