UBS-Server / routes /klotski.py
m-abdur2024's picture
Upload 40 files
0d3476b verified
raw
history blame
No virus
2.83 kB
import json
from flask import Flask, request, jsonify
from routes import app
# Directions mapping
DIRECTION_DELTAS = {
'N': (-1, 0),
'S': (1, 0),
'W': (0, -1),
'E': (0, 1)
}
class Block:
def __init__(self, name, cells):
self.name = name
self.cells = set(cells) # Set of (row, col) tuples
self.update_dimensions()
def update_dimensions(self):
rows = [r for r, c in self.cells]
cols = [c for r, c in self.cells]
self.top = min(rows)
self.bottom = max(rows)
self.left = min(cols)
self.right = max(cols)
self.height = self.bottom - self.top + 1
self.width = self.right - self.left + 1
def move(self, direction, grid):
delta_row, delta_col = DIRECTION_DELTAS[direction]
new_cells = set()
for r, c in self.cells:
new_r, new_c = r + delta_row, c + delta_col
new_cells.add((new_r, new_c))
# Check boundaries and collisions
for r, c in new_cells:
if not (0 <= r < 5 and 0 <= c < 4):
raise ValueError("Move out of bounds")
if grid[r][c] not in ('@', self.name):
raise ValueError("Collision detected")
# Update grid
for r, c in self.cells:
grid[r][c] = '@'
for r, c in new_cells:
grid[r][c] = self.name
self.cells = new_cells
self.update_dimensions()
def parse_board(board_str):
grid = []
for i in range(0, 20, 4):
grid.append(list(board_str[i:i+4]))
blocks = {}
for r in range(5):
for c in range(4):
char = grid[r][c]
if char != '@':
if char not in blocks:
blocks[char] = set()
blocks[char].add((r, c))
block_objects = {}
for name, cells in blocks.items():
block_objects[name] = Block(name, cells)
return grid, block_objects
def serialize_grid(grid):
return ''.join([''.join(row) for row in grid])
@app.route('/klotski', methods=['POST'])
def klotski():
data = request.get_json()
result = []
for item in data:
board_str = item['board']
moves_str = item['moves']
grid, blocks = parse_board(board_str)
# Process moves in pairs
for i in range(0, len(moves_str), 2):
block_name = moves_str[i]
direction = moves_str[i+1]
block = blocks.get(block_name)
if not block:
raise ValueError(f"Block {block_name} not found")
block.move(direction, grid)
result.append(serialize_grid(grid))
return jsonify(result)