Initial commit

This commit is contained in:
2025-07-04 20:25:20 +03:00
commit e2b0221d80
73 changed files with 22186 additions and 0 deletions
+243
View File
@@ -0,0 +1,243 @@
from meshlib import mrmeshpy
from meshlib import mrmeshnumpy
import numpy as np
def check_x(path):
points = np.ndarray(shape=(len(path),2), dtype=np.float32, buffer=np.array(path))
polyline = mrmeshnumpy.polyline2FromPoints(points)
selfIntersections = mrmeshpy.findSelfCollidingEdges(polyline)
if selfIntersections.size() > 0:
return False
return True
def level1():
output=[]
map = []
with open("level1_5.in") as f:
n=int(f.readline())
for i in range(n):
map.append(list(f.readline()))
printMap(map)
n_nr = int(f.readline())
for i in range(n_nr):
x,y = f.readline().split(',')
x=int(x)
y=int(y)
s=map[y][x]
output.append(s)
return output
def printMap(map):
for i in range(len(map)):
for j in range(len(map[i])):
print(map[i][j], end=' ')
print()
def readMap():
map = []
with open("level1.in") as f:
n=int(f.readline())
for i in range(n):
map.append(f.readline().split())
return (n,map)
#implement the disktra for the map given 2 points find if they are connected return true or false, they are connected only on
def disktra(map, x1, y1, x2, y2):
priority_queue = [(x1,y1)]
visited = []
while priority_queue:
current_node = priority_queue.pop(0)
visited.append(current_node)
x1 = current_node[0]
y1 = current_node[1]
if current_node[0] == x2 and current_node[1] == y2:
return True
if x1 > 0 and map[x1-1][y1] == '1' and (x1-1,y1) not in visited and (x1-1,y1) not in priority_queue:
priority_queue.append((x1-1,y1))
if x1 < len(map) and map[x1+1][y1] == '1' and (x1+1,y1) not in visited and (x1+1,y1) not in priority_queue:
priority_queue.append((x1+1,y1))
if y1 > 0 and map[x1][y1-1] == '1' and (x1,y1-1) not in visited and (x1,y1-1) not in priority_queue:
priority_queue.append((x1,y1-1))
if y1 < len(map[0]) and map[x1][y1+1] == '1' and (x1,y1+1) not in visited and (x1,y1+1) not in priority_queue:
priority_queue.append((x1,y1+1))
return False
# Pseudo-code to find and return a cycle in a 2D matrix graph using DFS
def findCycle(graph):
# Create a 2D matrix to store visited vertices
visited = [[False for _ in range(len(graph[0]))] for _ in range(len(graph))]
# Define possible directions (up, down, left, right)
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
# Iterate through all vertices and start a DFS from unvisited vertices
for i in range(len(graph)):
for j in range(len(graph[0])):
if not visited[i][j]:
path = [] # Store the path during DFS
if dfsFindCycle(graph, visited, i, j, -1, -1, directions, path):
return path # Cycle found
return None # No cycle found
def dfsFindCycle(graph, visited, x, y, parent_x, parent_y, directions, path):
visited[x][y] = True
path.append((x, y)) # Add the current vertex to the path
for dx, dy in directions:
new_x, new_y = x + dx, y + dy
if isInsideGrid(new_x, new_y, graph) and not visited[new_x][new_y] and graph[new_x][new_y] == 1:
if (new_x, new_y) in path:
# Cycle found, return the path
return True
if dfsFindCycle(graph, visited, new_x, new_y, x, y, directions, path):
return True
path.pop() # Remove the current vertex from the path if no cycle is found
return False
def isInsideGrid(x, y, graph):
return 0 <= x < len(graph) and 0 <= y < len(graph[0])
def level2():
output=[]
map = []
with open("level2_.in") as f:
n=int(f.readline())
for i in range(n):
map.append(list(f.readline()))
map=transpose(map)
n_nr = int(f.readline())
for i in range(n_nr):
c1,c2 = f.readline().split(' ')
x1,y1 = c1.split(',')
x1=int(x1)
y1=int(y1)
x2,y2 = c2.split(',')
x2=int(x2)
y2=int(y2)
s=disktra(map,x1,y1,x2,y2)
if s:
output.append('SAME')
else:
output.append('DIFFERENT')
return output
def transpose(map):
new_map = []
for i in range(len(map[0])):
new_map.append([])
for j in range(len(map)):
new_map[i].append(map[j][i])
return new_map
def level_3():
output=[]
map = []
with open("level3_1.in") as f:
n=int(f.readline())
for i in range(n):
map.append(list(f.readline()))
printMap(map)
n_nr = int(f.readline())
for i in range(n_nr):
path = f.readline().split(' ')
for j in range(len(path)):
path[j] = path[j].split(',')
path[j][0] = int(path[j][0])
path[j][1] = int(path[j][1])
path[j] = tuple(path[j])
s=check_x(path)
if s:
output.append('VALID')
else:
output.append('INVALID')
return output
def check_path(path):
for index, c in enumerate(path):
print(index)
print(c)
x = c[0]
y = c[1]
if path.count((x,y))>1:
return False
if index == len(path)-1:
break
next = path[index+1]
if x == next[0]:
continue
if y == next[1]:
continue
if (x,next[1]) in path :
index_of_closest = path.index((x,next[1]))+1
next_close = path[index_of_closest]
if next_close[1] == next[1]:
return False
if next_close[0] == x:
continue
if next_close[0]-x and next_close[1] == y:
return False
if (next[0],y) in path:
index_of_closest = path.index((next[0],y))+1
next_close = path[index_of_closest]
if next_close[0] == next[0]:
return False
if next_close[1] == y:
continue
if abs(next_close[1]-y)==1 and next_close[0] == x:
return False
return True
def level5():
output=[]
map = []
with open("level5_example.in") as f:
n=int(f.readline())
for i in range(n):
map.append(list(f.readline()))
n_nr = int(f.readline())
border=build_border(map)
return border
def build_border(map):
border = [[0 for i in range(len(map[0]))] for j in range(len(map))]
for x1 in range(len(map)):
for y1 in range(len(map)):
if map[x1][y1] == 'L':
border[x1][y1]=-1
if x1 > 0 and border[x1-1][y1] != -1:
border[x1-1][y1]=1
if x1 < len(map) and border[x1+1][y1] != -1:
border[x1+1][y1]=1
if y1 > 0 and border[x1][y1-1] != -1:
border[x1][y1-1]=1
if y1 < len(map[0]) and border[x1][y1+1] != -1:
border[x1][y1+1]=1
return border
def main():
output=level5()
s=findCycle(output)
print(s)
if __name__ == '__main__':
main()
# code that given a list of connected coordinates checks if an X is form in a 2x2 square