26.找单词--OD

本文介绍了在一个二维数组中按照特定规则(不允许重复使用同一单元格)搜索给定字符串的方法,通过深度递归实现路径的追踪,并返回找到字符串的坐标序列。
摘要由CSDN通过智能技术生成
# 给你一个字符串,和一个二维数组,如果字符串在数组中没,返回字符串在数组的下标
# 要求:
# 1)需要按照字符串顺序搜索,水平或者垂直方向搜索
# 2)同一单元格不允许重复使用
# 3)假定数组中最多只存在一种匹配
# 找不到返回N
#
# 输入:
# 第一行n表示有n行字符数组输入
# 接下来n行字符串
# 第n+2行表示要查找的字符串
# 4
# A,C,C,F
# C,D,E,D
# B,E,S,S
# F,E,C,A
# ACCESS
#
# 输出:
# 0,0,0,1,0,2,1,2,2,2,2,3
#
import sys

def exist(board, word):
    h = len(board)
    w = len(board[0])
    visited = [[False for j in range(w)] for i in range(h)]
    for i in range(h):
        for j in range(w):
            if check(board, visited, i, j, word, 0):
                res.append(str(i) + "," + str(j))  # 最后添加起点坐标,这里是(0,0)
                return True  # 当前坐标(i,j)为起点找到给定字符串
    return False  # 遍历所有元素作为起点 ,没找到给定字符串


def check(board, visited, i, j, s, k):
    # 如果搜索当前字符和要查找的字符不等,直接返回False
    if board[i][j] != s[k]:
        return False
    # 终止条件
    elif k == len(s) - 1:
        return True
    visited[i][j] = True
    directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]
    for dir in directions:
        newi = i + dir[0]
        newj = j + dir[1]
        if newi >= 0 and newi < len(board) and newj >= 0 and newj < len(board[0]):
            if not visited[newi][newj]:
                # 不停深度递归查找到最后一个元素匹配,达到终止条件
                if check(board, visited, newi, newj, s, k + 1):
                    # res = ['2,3', '2,2', '1,2', '0,2', '0,1']
                    res.append(str(newi) + "," + str(newj))
                    visited[i][j] = False  # 如果最后一个元素匹配,开始回溯,并倒序的添加结果到res
                    return True
    visited[i][j] = False
    return False


res = []
N = int(input().strip())
matrix = [list(input().strip().replace(",", "")) for i in range(N)]
word = input().strip()

if exist(matrix, word):  # res= ['2,3', '2,2', '1,2', '0,2', '0,1', '0,0']
    for i in range(len(res) - 1, -1, -1):
        sys.stdout.write(res[i])
        if i != 0:
            sys.stdout.write(",")
else:
    print("N")


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值