示例:board =[ [‘A’,’B’,’C’,’E’], [‘S’,’F’,’C’,’S’], [‘A’,’D’,’E’,’E’]] ,给定 word = “ABCCED”, 返回 true, 给定 word = “SEE”, 返回 true, 给定 word = “ABCB”, 返回 false。
4、班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
defFourColorLabel(M):#回溯法地图四色 Num=len(M) Color=[-1for i inrange(Num)] n=m=1 #染色第一个区域,先设置为1 while m<=Num: while n<=4and m<=Num: flag=True for k inrange(m-1): if M[m-1][k]==1and Color[k]==n:#如果与第m-1个点接触且颜色相同则回溯 flag=False n+=1 break if flag:#flag为true,则涂色 Color[m-1]=n; m+=1 n=1 if n>4: #颜色使用超过4种,说明之前涂色有问题,回溯 m-=1 n=Color[m-1]+1 return Color M=[ [0,1,0,0,0,0,1], [1,0,1,1,1,1,1], [0,1,0,1,0,0,0], [0,1,1,0,1,0,0], [0,1,0,1,0,1,0], [0,1,0,0,1,0,1], [1,1,0,0,0,1,0] ]#关系矩阵,M[i][j]为1则表示i与j相邻,为0则表示不相邻 for i in FourColorLabel(M): print(i)
#n:物品件数;c:最大承重为c的背包;w:各个物品的重量;v:各个物品的价值 #w[i]:第i个物体的重量 #p[i]:第i个物体的价值 #c[i][j]:前i个物体放入容量为j 包的最大价值 #c[i-1][j]:前i个物体放入容量为j 包的最大价值 #c[i-1][j-w[i]]:前i-1个物体放入容量为j-w[i] 包的最大价值 defknapsack(n,c,w,p):#动态规划算法求出最大价值 res=[[-1for j inrange(c+1)]for i inrange(n+1)] for j inrange(c+1): #第0行全部赋值为0,物品编号从1开始.为了下面赋值方便 res[0][j]=0 for i inrange(1,n+1): for j inrange(1,c+1): res[i][j]=res[i-1][j] #生成了n*c有效矩阵,以下公式w[i-1],p[i-1]代表从第一个元素w[0],p[0]开始取。 if(j>=w[i-1]) and res[i-1][j-w[i-1]]+p[i-1]>res[i][j]: res[i][j]=res[i-1][j-w[i-1]]+p[i-1] return res defshow(n,c,w,res):#输出最大价值和选择的物品 print('最大价值为:',res[n][c]) x=[Falsefor i inrange(n)] j=c for i inrange(1,n+1): if res[i][j]>res[i-1][j]:#res[i][j]>res[i-1][j]则表示第i个物品放入背包 x[i-1]=True j-=w[i-1] print ("选择的物品为:",end=" ") for i inrange(n): if x[i]: print('第',i+1,'个',end=" ") if __name__=='__main__': n=5 c=10 weight=[2,2,6,5,4] price=[6,3,5,4,6] res=knapsack(n,c,weight,price) show(n,c,weight,res)
classSolution(object): # 定义上下左右四个行走方向 directs = [(0, 1), (0, -1), (1, 0), (-1, 0)] defexist(self, board, word): m = len(board)#m表示二维矩阵宽 if m == 0: returnFalse n = len(board[0])#n表示二维矩阵场 mark = [[0for _ inrange(n)] for _ inrange(m)]#mark[i][j]记录是否遍历过,1表示已遍历,0表示没有 for i inrange(len(board)): for j inrange(len(board[0])):#每次从board[i][j]开始遍历 if board[i][j] == word[0]: # 将该元素标记为已使用 mark[i][j] = 1 if self.backtrack(i, j, mark, board, word[1:]) == True:#只要有一次返回true则函数返回true returnTrue else: # 回溯 mark[i][j] = 0 returnFalse defbacktrack(self, i, j, mark, board, word):#从board[i][j]开始遍历,mark[i][j]记录是否遍历过,board为二维数组,word为单词 iflen(word) == 0: returnTrue for direct in self.directs:#每次都按上,下,右,左遍历 cur_i = i + direct[0] cur_j = j + direct[1] if cur_i >= 0and cur_i < len(board) and cur_j >= 0and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:#保证board[cur_i][cur_j]不越界且等于word[0] if mark[cur_i][cur_j] == 1:# 如果是已经使用过的元素,忽略 continue mark[cur_i][cur_j] = 1# 将该元素标记为已使用 if self.backtrack(cur_i, cur_j, mark, board, word[1:]) == True: returnTrue else: # 不满足条件则回溯 mark[cur_i][cur_j] = 0 returnFalse if __name__ == '__main__': board = [ ['A', 'B', 'C', 'E'], ['S', 'F', 'C', 'S'], ['A', 'D', 'E', 'E'] ] solution = Solution() word = "ABCCED" res = solution.exist(board, word) print(res)
4、班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。 示例1:输入: [[1,1,0], [1,1,0], [0,0,1]] 输出: 2 说明:已知学生0和学生1互为朋友,他们在一个朋友圈。第2个学生自己在一个朋友圈。所以返回2。 示例2:输入: [[1,1,0], [1,1,1], [0,1,1]] 输出: 1 说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。
deffindCircleNum(M): N, visited, res = len(M), set(), 0 for i inrange(N):#宽度优先搜索算法 if i notin visited:#当第i个未被访问时 queue = [i] while queue:#while将所有从第i个人能够达到的人遍历完 p = queue.pop(0) if p notin visited: visited.add(p)#从i能够到达的点加入visited queue += [k for k, num inenumerate(M[p]) if num and k notin visited] #queue加入通过enumerate(M[p])遍历的所能达到的未被遍历的点 res += 1#一次遍历完,res+1 return res