owned this note
owned this note
Published
Linked with GitHub
https://hwchang0417.wordpress.com/category/leetcode/
https://kopu.chat/2017/09/22/%E5%AF%A6%E4%BD%9Cgraph%E8%88%87dfs%E3%80%81bfs%E8%B5%B0%E8%A8%AA/
https://kopu.chat/2017/09/22/%E5%AF%A6%E4%BD%9Cgraph%E8%88%87dfs%E3%80%81bfs%E8%B5%B0%E8%A8%AA/
http://www.cs.nthu.edu.tw/~dr834314/STL/link-list.html
http://larry850806.github.io/2016/06/06/STL1/#stack
https://blog.csdn.net/helloworlddm/article/details/76785268
```pyhton
# -*- cding: utf-8 -*-
"""
Created on Thu Apr 18 10:12:21 2019
@author: x213212
"""
import os
import time
import random
import numpy as np
__author__ = 'Minsuk Heo'
#matrix=[]
#matrix.append([])
#matrix.append([])
#matrix[0].append(3)
#matrix[0].append(5)
#matrix[0].append(6)
#matrix[0].append(7)
#matrix[0].append(8)
#matrix[1].append(4)
#matrix[1].append(5)
#matrix[1].append(3)
#matrix[1].append(2)
#matrix[1].append(3)
#print(matrix)
#決定陣列大小
width = 8
height = 8
def k(start, tmp , tmp2):
# if( len(tmp2 )) == 0)
for x in tmp :
if (x[0]==start):
tmp2.append([x])
flag_name = tmp[0][0]
for x in tmp:
count = 0
count2 = 0
value = 0
for y in tmp2:
for indey in y:
if(indey == flag_name ):
tmp2[count2].append(x[1])
if(x[0] !=flag_name):
flag_name = x[0]
count2 +=1
# for index in x :
## print (index)
# for indey in y :
# find = False
#
#
# for z in range (0,len(tmp2[count2]),1):
# if (index == tmp2[count2][z] ):
# find = True
# print ('find')
#
## print ( tmp2[count2].index('1'))
# if(index == indey ):
# value = index
# print ( tmp2[count2])
# print (count2)
# tmp2[count2].append(tmp[count][1 ])
# break
#
# count +=1
# count2 +=1
# print ( tmp[count] , count )
# print ('sss')
# if (value >0 and tmp2[count].index(value) == -1):
# tmp2[count].append(value)
#vertexList = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
#edgeList = [(0,1), (1,2), (1,3), (3,4), (4,5), (1,6)]
#index = [i for i in range(len(edgeList))]
#np.random.shuffle(index)
new_edgeList = []
dept = [0*x for x in range(width * height)]
#for x in index :
# new_edgeList.append(edgeList [x])
#print (edgeList)
print (new_edgeList)
#創建一微陣列 VERTEXlIST
new_vertexList = []
#得到49個點
for x in range (0,width*height ,1) :
new_vertexList.append('t'+str(x))
new_vertexList.append('■')
#為點加上邊 49個點其實是 二微陣列 所以每七個代表一個維度
matrix = []
#創建二微陣列 後面要來顯示搜尋結果
count = 0
for x in range (0,width,1):
matrix.append([])
for y in range (0,height , 1 ):
if( random.randint(0,4) == 4):
matrix[x].append ('■')
else:
matrix[x].append ('t'+str(count))
count = count +1
print (matrix)
matrix2 =matrix3= matrix
#開始創建邊 相鄰串列
count =0
for x in range (0,width,1):
for y in range (0,height,1):
if( x - 1 >=0):
if( matrix[x-1][y] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x-1][y]) ))
if ( x + 1 <= width-1 ):
if( matrix[x+1][y] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x+1][y]) ))
if ( y - 1 >=0 ):
if( matrix[x][y-1] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x][y-1]) ))
if ( y + 1 <= height-1):
if( matrix[x][y+1] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x][y+1]) ))
count = count +1
print (new_edgeList)
print (len(new_edgeList))
print (new_edgeList)
print (new_vertexList)
edgeList = new_edgeList
vertexList = new_vertexList
record = []
record2 = []
#data = edgeList[index]
#test_list=[ [0] * 6 for i in range(6) ]
#matrix = []
#
##創建二微陣列 後面要來顯示搜尋結果
#for x in range (0,width,1):
# matrix.append([])
# for y in range (0,height , 1 ):
# matrix[x].append ((x,y))
graphs = (vertexList, edgeList)
def backtrace(parent, start, end):
path = [end]
while path[-1] != start:
path.append(parent[path[-1]])
path.reverse()
return path
def bfs(graph, start,find):
vertexList, edgeList = graph
visitedList = []
queue = [vertexList.index(start)]
adjacencyList = [[] for vertex in vertexList]
# fill adjacencyList from graph
for edge in edgeList:
adjacencyList[edge[0]].append(edge[1])
# print (str(edge[0])+','+str(edge[1]))
# print (adjacencyList)
# print (adjacencyList)
# print ('--------------------')
# print (graph)
# print ('--------------------')
# bfs
while queue:
# print (queue)
current = queue.pop()
for neighbor in adjacencyList[current]:
# if (vertexList[neighbor] != '■') :
if not neighbor in visitedList:
# queue.insert(0,neighbor)
queue.append(neighbor)
record2.append([current,neighbor])
# tx_tmp =record2[neighbor]
# record2[neighbor]= tx_tmp.append(current)
# 記錄每一步
visitedList.append(current)
record.append (current)
# 加快搜尋路徑
visitedList.append(current)
l2 = list(set(visitedList))
# l2.sort(key=l1.index)
visitedList = l2
for tmp in visitedList :
dept [tmp] = dept [tmp ] + 1
# 需要在這裡 增加動畫
#--------------------
os.system("cls")
print ("serachering ~")
# time.sleep(0.0001)
for z in visitedList:
if(z == 0):
matrix[0][0] = 'x'
elif(z != 0):
if(matrix[int(z/width)][int(z%width)] == vertexList[z] ):
matrix[int(z/width)][int(z%width)] = 'x'
#--------------------
#顯示矩陣
for show in matrix :
print (show)
#--------------------
if(vertexList[current] == find):
print ('find!')
break
else :
print ('no find!')
# print (current)
# print (visitedList)
print ('走訪路徑')
print ('--------------------')
# return visitedList
return visitedList
#for tmp in matrix :
# print (tmp)
#for x in bfs(graphs, 0,1):
# print (vertexList[x])
ret =bfs(graphs,'t33','t63')
for y in ret:
for x in range ( 0 , width , 1 ):
for y in range (0, height ,1 ):
if ( y == matrix2[x][y] ):
matrix2[x][y] =='x'
for show in matrix2 :
print (show)
#print (ret)
count =0
for x in range ( 0 , width , 1 ):
for y in range (0, height ,1 ):
matrix3[x][y] = dept[count]
count +=1
print ('--------------------')
for show in matrix3 :
print (show)
print (record2)
record3=[[33]]
k(vertexList.index('t33'),record2,record3)
print (record3)
#print (bfs(graphs,'t33','t63'))
#for x in bfs(graphs, 0,'t46'):
# print (vertexList[x])
#print(bfs(graphs, 0,'D'))
#print (matrix)
# 註解 快速清除
#os.system("cls")
```pyhton
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 18 10:12:21 2019
@author: x213212
"""
import os
import time
import random
import numpy as np
__author__ = 'Minsuk Heo'
#matrix=[]
#matrix.append([])
#matrix.append([])
#matrix[0].append(3)
#matrix[0].append(5)
#matrix[0].append(6)
#matrix[0].append(7)
#matrix[0].append(8)
#matrix[1].append(4)
#matrix[1].append(5)
#matrix[1].append(3)
#matrix[1].append(2)
#matrix[1].append(3)
#print(matrix)
#決定陣列大小
width = 10
height = 10
# Python program to mirror an n-ary tree
# Represents a node of an n-ary tree
class Node :
# Utility function to create a new tree node
def __init__(self ,key):
self.key = key
self.child = []
# Function to convert a tree to its mirror
def mirrorTree(root):
# Base Case : nothing to do if root is None
if root is None:
return
# Number of children of root
n = len(root.child)
# If number of child is less than 2 i.e.
# 0 or 1 we don't need to do anything
if n <2 :
return
# Calling mirror function for each child
for i in range(n):
mirrorTree(root.child[i]);
# Reverse variable sized array of child pointers
root.child.reverse()
# Prints the n-ary tree level wise
def printNodeLevelWise(root,tmp,tmp2):
if root is None:
return
# create a queue and enqueue root to it
queue = []
queue.append(root)
# Do level order traversal. Two loops are used
# to make sure that different levels are printed
# in different lines
while(len(queue) >0):
n = len(queue)
max_n = len(queue)
while(n > 0) :
# Dequeue an item from queue and print it
p = queue[0]
queue.pop(0)
# if(str(p.key) == str(tmp) ):
# print ('在'+ str(max_n-n) +'找到了'+str(tmp))
# print (p.key, )
# Enqueue all children of the dequeued item
for index, value in enumerate(p.child):
queue.append(value)
if(str(value.key) == str(tmp) ):
# print ('sercher!')
p.child[index].child.append(tmp2)
return
# print ('tmp:' + str(n))
n -= 1
# print ("") # Seperator between levels
# Prints the n-ary tree level wise
def printNodeLevelWise2(root):
if root is None:
return
# create a queue and enqueue root to it
queue = []
queue.append(root)
# Do level order traversal. Two loops are used
# to make sure that different levels are printed
# in different lines
all_len = 0
while(len(queue) >0):
n = len(queue)
while(n > 0) :
# Dequeue an item from queue and print it
p = queue[0]
queue.pop(0)
# if(str(p.key) == str(tmp) ):
# print ('在'+ str(max_n-n) +'找到了'+str(tmp))
# print (p.key, )
print(str(p.key)+' ', end='')
# Enqueue all children of the dequeued item
for index, value in enumerate(p.child):
# if(str(value.key) == str(tmp) ):
## print ('sercher!')
# print (p.child[index].child.append(tmp2))
#
queue.append(value)
n -= 1
all_len+=1
print ("") # Seperator between levels
print (all_len)
def printNodeLevelWise3(root,tmp,start,tmp2,tmp3):
if root is None:
return
# create a queue and enqueue root to it
queue = []
queue.append(root)
# Do level order traversal. Two loops are used
# to make sure that different levels are printed
# in different lines
while(len(queue) >0):
n = len(queue)
max_n = len(queue)
while(n > 0) :
# Dequeue an item from queue and print it
p = queue[0]
queue.pop(0)
# if(str(p.key) == str(tmp) ):
# print ('在'+ str(max_n-n) +'找到了'+str(tmp))
# print (p.key, )
if(start ==tmp):
print (p.key)
if(len(tmp3)):
tmp3.append(p.key)
tmp2.append(tmp3)
tmp3 = []
return
# Enqueue all children of the dequeued item
for index, value in enumerate(p.child):
queue.append(value)
if(str(value.key) == str(tmp) ):
# print ('sercher!')
print (str (value.key)+' ', end='')
tmp3.append(value.key)
printNodeLevelWise3(root,p.key,start,tmp2,tmp3)
tmp3 = []
# print (p.child[index].child.append(tmp2))
n -= 1
# print ("")
# Driver Program
""" Let us create below tree
* 10
* / / \ \
* 2 34 56 100
* | / | \
* 1 7 8 9
"""
def k(start, end,tmp , tmp2):
# if( len(tmp2 )) == 0)
# for x in tmp :
# if (x[0]==start):
# tmp2.append([x])
flag_name = tmp[0][0]
for x in tmp:
count = 0
count2 = 0
value = 0
for y in tmp2:
for indey in y:
# if(indey == flag_name ):
## print (tmp2[count2])
# flag_bo =False
# for z in tmp2[count2]:
# if (x[1] == z):
# flag_bo = True
# if(flag_bo == False):
# tmp2[count2].append(x[1])
if(x[0] !=flag_name):
flag_name = x[0]
if(x[0] == start):
print (x[0])
if(x[1] == end):
tmp2[count2].append(x[1])
else:
tmp2[count2].append(flag_name)
count2 +=1
def k2(start, end,tmp , tmp2):
# if( len(tmp2 )) == 0)
root = Node(start)
for x in tmp :
if (x[0]==start):
root.child.append(Node(x[1]))
for x in tmp:
printNodeLevelWise(root,x[0],Node (x[1]) )
test = []
test2 = []
printNodeLevelWise3(root ,end, start,test,test2)
test3 = [test[0]]
for x in test :
find_bool = False
for y in test3:
if (y == x ):
find_bool = True
if(find_bool == False):
test3.append(x)
print ('--------------------')
for x in test3 :
print (x)
# flag_name = tmp[0][0]
# for x in tmp:
# count = 0
# count2 = 0
# value = 0
# for y in tmp2:
# for indey in y:
## if(indey == flag_name ):
### print (tmp2[count2])
## flag_bo =False
## for z in tmp2[count2]:
## if (x[1] == z):
## flag_bo = True
## if(flag_bo == False):
## tmp2[count2].append(x[1])
# if(x[0] !=flag_name):
#
# flag_name = x[0]
#
# if(x[0] == start):
# print (x[0])
# if(x[1] == end):
# tmp2[count2].append(x[1])
# else:
# tmp2[count2].append(flag_name)
# count2 +=1
# for index in x :
## print (index)
# for indey in y :
# find = False
#
#
# for z in range (0,len(tmp2[count2]),1):
# if (index == tmp2[count2][z] ):
# find = True
# print ('find')
#
## print ( tmp2[count2].index('1'))
# if(index == indey ):
# value = index
# print ( tmp2[count2])
# print (count2)
# tmp2[count2].append(tmp[count][1 ])
# break
#
# count +=1
# count2 +=1
# print ( tmp[count] , count )
# print ('sss')
# if (value >0 and tmp2[count].index(value) == -1):
# tmp2[count].append(value)
#vertexList = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
#edgeList = [(0,1), (1,2), (1,3), (3,4), (4,5), (1,6)]
#index = [i for i in range(len(edgeList))]
#np.random.shuffle(index)
new_edgeList = []
dept = [0*x for x in range(width * height)]
#for x in index :
# new_edgeList.append(edgeList [x])
#print (edgeList)
print (new_edgeList)
#創建一微陣列 VERTEXlIST
new_vertexList = []
#得到49個點
for x in range (0,width*height ,1) :
new_vertexList.append('t'+str(x))
new_vertexList.append('■')
#為點加上邊 49個點其實是 二微陣列 所以每七個代表一個維度
matrix = []
#創建二微陣列 後面要來顯示搜尋結果
count = 0
for x in range (0,width,1):
matrix.append([])
for y in range (0,height , 1 ):
if( random.randint(0,4) == 4):
matrix[x].append ('■')
else:
matrix[x].append ('t'+str(count))
count = count +1
print (matrix)
matrix2 =matrix3= matrix
#開始創建邊 相鄰串列
count =0
for x in range (0,width,1):
for y in range (0,height,1):
if( x - 1 >=0):
if( matrix[x-1][y] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x-1][y]) ))
if ( x + 1 <= width-1 ):
if( matrix[x+1][y] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x+1][y]) ))
if ( y - 1 >=0 ):
if( matrix[x][y-1] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x][y-1]) ))
if ( y + 1 <= height-1):
if( matrix[x][y+1] != '■'):
new_edgeList.append( (new_vertexList.index(matrix[x][y]), new_vertexList.index(matrix[x][y+1]) ))
count = count +1
print (new_edgeList)
print (len(new_edgeList))
print (new_edgeList)
print (new_vertexList)
edgeList = new_edgeList
vertexList = new_vertexList
record = []
record2 = []
#data = edgeList[index]
#test_list=[ [0] * 6 for i in range(6) ]
#matrix = []
#
##創建二微陣列 後面要來顯示搜尋結果
#for x in range (0,width,1):
# matrix.append([])
# for y in range (0,height , 1 ):
# matrix[x].append ((x,y))
graphs = (vertexList, edgeList)
def backtrace(parent, start, end):
path = [end]
while path[-1] != start:
path.append(parent[path[-1]])
path.reverse()
return path
def bfs(graph, start,find):
vertexList, edgeList = graph
visitedList = []
queue = [vertexList.index(start)]
adjacencyList = [[] for vertex in vertexList]
# fill adjacencyList from graph
for edge in edgeList:
adjacencyList[edge[0]].append(edge[1])
# print (str(edge[0])+','+str(edge[1]))
# print (adjacencyList)
# print (adjacencyList)
# print ('--------------------')
# print (graph)
# print ('--------------------')
# bfs
while queue:
# print (queue)
current = queue.pop()
for neighbor in adjacencyList[current]:
# if (vertexList[neighbor] != '■') :
if not neighbor in visitedList:
queue.insert(0,neighbor)
# queue.append(neighbor)
bool_flag = False
for tmp in record2 :
if(tmp == [current,neighbor]):
bool_flag = True
if (bool_flag == False) :
record2.append([current,neighbor])
# tx_tmp =record2[neighbor]
# record2[neighbor]= tx_tmp.append(current)
# 記錄每一步
visitedList.append(current)
record.append (current)
# 加快搜尋路徑
visitedList.append(current)
l2 = list(set(visitedList))
# l2.sort(key=l1.index)
visitedList = l2
for tmp in visitedList :
dept [tmp] = dept [tmp ] + 1
# 需要在這裡 增加動畫
#--------------------
os.system("cls")
print ("serachering ~")
# time.sleep(0.0001)
for z in visitedList:
if(z == 0):
matrix[0][0] = 'x'
elif(z != 0):
if(matrix[int(z/width)][int(z%width)] == vertexList[z] ):
matrix[int(z/width)][int(z%width)] = 'x'
#--------------------
#顯示矩陣
for show in matrix :
print (show)
#-------------------- 搜尋目標
# if(vertexList[current] == find):
# print ('find!')
# break
# else :
# print ('no find!')
#--------------------
# print (current)
# print (visitedList)
print ('走訪路徑')
print ('--------------------')
# return visitedList
return visitedList
#for tmp in matrix :
# print (tmp)
#for x in bfs(graphs, 0,1):
# print (vertexList[x])
ret =bfs(graphs,'t33','t63')
for y in ret:
for x in range ( 0 , width , 1 ):
for y in range (0, height ,1 ):
if ( y == matrix2[x][y] ):
matrix2[x][y] =='x'
for show in matrix2 :
print (show)
#print (ret)
count =0
for x in range ( 0 , width , 1 ):
for y in range (0, height ,1 ):
matrix3[x][y] = dept[count]
count +=1
print ('--------------------')
for show in matrix3 :
print (show)
print (record2)
record3=[[33]]
print ('--------------------')
k2(vertexList.index('t33'),vertexList.index('t63'),record2,record3)
#record2 = list(set(record2 ))
#print (record2)
#print (record3)
#print (bfs(graphs,'t33','t63'))
#for x in bfs(graphs, 0,'t46'):
# print (vertexList[x])
#print(bfs(graphs, 0,'D'))
#print (matrix)
# 註解 快速清除