文章目錄
- 卡碼網110.字符串接龍
- 105.有向圖的完全可達性
- 106.島嶼的周長
卡碼網110.字符串接龍
這題是在字符串上進行廣搜,字符串廣搜是對一個字符串按照位置來搜索,與原字符串只有一個位置字符不同那么就是在原字符串的基礎上距離加1。因此需要一個字典來記錄每個字符串和beginStr的距離,然后創建一個隊列,每次對隊列第一個字符串進行廣搜,找到匹配且沒有訪問過的字符串就加入隊列尾部等待處理,并且在字典中令他的距離變成現在訪問的字符串的距離+1,直到遇見和endStr匹配的字符串輸出距離。因為廣搜是距離從小到達搜索的,所以第一次遇到和endStr匹配的就一定是最小距離。
import re
import collections
def bfs(strings, beginStr, endStr):visited = {}for string in strings:visited[string] = 1visited[beginStr] = 1st = collections.deque([beginStr])while st:temp = st.popleft()path = visited[temp]for i in range(len(beginStr)):regex = re.compile(temp[:i]+'.'+temp[i+1:])if regex.fullmatch(endStr):return path+1for s in strings:if regex.fullmatch(s) and visited[s] == 1:st.append(s)visited[s] = path + 1return 0if __name__ == '__main__':n = int(input())beginStr, endStr = input().split()strings = []for i in range(n):strings.append(input())print(bfs(strings, beginStr, endStr))
105.有向圖的完全可達性
DFS去從1開始深度搜索,搜索到的結點標注,最后如果所有結點都標注了就輸出1否則為-1。
def dfs(cur, pairs, visited):if visited[cur]==1:return visited[cur] = 1for nextNode in pairs[cur]:dfs(nextNode, pairs, visited)if __name__=='__main__':n, k = map(int, input().split())pairs = [[] for _ in range(n+1)]for i in range(k):a, b = map(int, input().split())pairs[a].append(b)visited = [0] * (n+1)dfs(1, pairs, visited)if sum(visited) == n:print(1)else:print(-1)
106.島嶼的周長
就是在之前島嶼相關題目的基礎上變形,在dfs/bfs的時候,如果遇到島嶼在往下一個區域探到海洋,那就讓周長+1,別的都一樣。
def dfs(x, y, islands, visited, perimeter):visited[x][y] = Truen = len(islands)m = len(islands[0])directions = [[1, 0], [-1, 0], [0, 1], [0, -1]]for d in directions:nextx = x + d[0]nexty = y + d[1]if nextx < 0 or nextx >= n or nexty < 0 or nexty >= m:perimeter += 1continueif islands[nextx][nexty] == 0:perimeter += 1continueif islands[nextx][nexty] == 1 and visited[nextx][nexty] == False:perimeter = dfs(nextx, nexty, islands, visited, perimeter)return perimeter
if __name__ == '__main__':n, m = map(int, input().split())islands = [[0] * m for _ in range(n)]for i in range(n):lands = input().split()for j in range(m):islands[i][j] = int(lands[j])visited = [[False] * m for _ in range(n)]for i in range(n):for j in range(m):if islands[i][j] == 1 and visited[i][j] == False:perimeter = dfs(i, j, islands, visited, 0)print(perimeter)