前情回顾
#! /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")