笔试刷题 | 回溯法

前情回顾

笔试刷题 | 积水问题(Python)

笔试刷题 | 快速排序与链表(Python)

笔试刷题 | 贪心算法

#! /usr/bin/env python
# -*-coding:utf-8-*-
"""
Author: ChileWang
Created at 2020/03/20 15:59


Question:
题目描述: 输入一个二维字符数组map和一个字符串数组word,
搜索word是否在map中。
搜索的定义是从map的任意位置开始,可以上下左右移动,
依次和word每个字符匹配,
如果word能匹配完,则存在,否则不存在。


  注:map中的每个位置只能被访问一次。


  acdz


  xtro


  fiwo


  如上述map,“zoo”能搜到,“wto”不能搜索到。
  
Solution:
回溯法


"""




def research(arr, word, i, j, flag, index):
    # index 为word的第index位


    # 当index == word的最后一个位置, 也就是前面的匹配都成功了,可以返回true
    if index == len(word):
        return True
    if i < 0 or i >= len(arr) or j < 0 or j >= len(arr[0]) or arr[i][j] != word[index] or flag[i * len(arr[0]) + j]:
        return False


    # 符合要求后,表示当前字符与字符串相等,将该字符标志为True, 再去判断剩下的字符
    flag[i * len(arr[0]) + j] = True
    # 递归上下左右字符是否匹配
    if research(arr, word, i-1, j, flag, index + 1) or research(arr, word, i + 1, j, flag, index + 1) or \
            research(arr, word, i, j - 1, flag, index + 1) or research(arr, word, i, j + 1, flag, index + 1):
        return True


    # 如果后面的不匹配, 则需要把当前的标志清除放回,相当于回退。  # 这是最重要的一步
    flag[i * len(arr[0]) + j] = False
    return False




def helper(arr, word):
    row = len(arr)
    col = len(arr[0])
    # 用一个数组表示某个元素上的位置是否使用过
    flag = [False for _ in range(row * col)]


    # 从每一个位置开始遍历是否包含此字符串
    for i in range(row):
        for j in range(col):
            if research(arr, word, i, j, flag, 0):
                return True


    return False




if __name__ == '__main__':
    # n = int(input("输入行:"))
    # m = int(input("输入列:"))
    q = int(input("输入待匹配的字符串的个数:"))
    # map = [[0] * m for _ in range(n)]
    # for i in range(n):
    #     for j in range(m):
    #         map[i][j] = input()
    # print(map)
    # map = [['a', 'a', 'a', 'a'], ['a', 'b', 'a', 'a'], ['a', 'a', 'a', 'a']]
    map = [['a', 'c', 'd', 'z'], ['x', 't', 'r', 'o'], ['f', 'l', 'w', 'o']]
    for i in range(q):
        s = input()
        f = helper(map, s)
        if f:
            print("Case" + str(i) + ':', "Has")
        else:
            print("Case" + str(i) + ':', "Not Has")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值