单词方阵(洛谷——P1101)---python(小白进,简单易懂)

因为这道题当时做的挺不容易的,所以斗胆来写一下题解
先看一下题目

题目描述
给一个n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:

	输入:
	8                     输出:
    qyizhong               *yizhong
    gydthkjy               gy******
    nwidghji               n*i*****
    orbzsfgz               o**z****
    hhgrhwth               h***h***
    zzzzzozo               z****o**
    iwdfrgng               i*****n*
    yyyygggg               y******g

输入格式
第一行输入一个数n。(7≤n≤100)。

第二行开始输入n×n的字母矩阵。

输出格式
突出显示单词的n×n矩阵

这道题呢我是采用DFS来解答的

首先是先对输入数据的处理

n = eval(input().strip())
lt = []
for p in range(n):
    lt.append(' '.join(input().strip()).split())
dx = [1,-1,0,0,-1,-1,1,1] 
dy = [0,0,1,-1,-1,1,-1,1]	#坐标转换列表
ls = [[0] * n for _ in range(n)]  #来存每个字母的状态,以便于判断是否用星号替换
res = 'yizhong'
L = [[0,0] for _a in range(7)] #保存坐标

这里的L用来保存符合题目条件的字母的坐标
下面是 重点 部分

def Search(x,y,cnt,p,q): #x和y为坐标  p和q为x和y的变值(即遍历方向)
    L[cnt] = [x,y]
    cnt += 1
    if cnt==7: #搜索到'g'的时候,表示前边都顺利搜索完毕,所以它们的坐标都被保存下来,在另一个数组做标记
        for ll in L:
            ls[ll[0]][ll[1]] = 1
    elif p==0 and q==0:#一开始先从八个方向判断符合条件的字母  然后就一直沿着这个方向遍历,直到找到'g'为止
        for k in range(8):
          x += dx[k]
          y += dy[k]
          if x>=0 and x<n and y>=0 and y<n and lt[x][y]==res[cnt]:
              Search(x,y,cnt,dx[k],dy[k]) #dx[k],dy[k]代表的就是一直沿着一个方向
          x -= dx[k]
          y -= dy[k]  #回溯
    else:
        x += p
        y += q
        if x>=0 and x<n and y>=0 and y<n and lt[x][y]==res[cnt]:
            Search(x,y,cnt,p,q)#p,q也是代表沿一个方向

这里的elif是先找到一个合法的遍历方向
else是顺着这个方向一直遍历下去
(只有最先开始遍历的时候才会满足elif的条件,后面的遍历都是执行的else代码块的代码)

最后是输出部分

for i in range(n):
    for j in range(n):
        if lt[i][j] == 'y':
            Search(i,j,0,0,0)
for mm in range(n):
    for nn  in range(n):
        if ls[mm][nn] == 1:
          print(lt[mm][nn],end='')
        else:
          print('*',end='')
    print('\n',end='')

初学搜索,来到的点个赞给个鼓励吧。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗阿强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值