因为这道题当时做的挺不容易的,所以斗胆来写一下题解
先看一下题目
题目描述
给一个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='')
初学搜索,来到的点个赞给个鼓励吧。