2014上海邀请赛 - E.Maze

现场没敲出来,回来写过了样例不知道能不能ac

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <cctype>
#include <vector>
#include <algorithm>
#include <stack>
#include <cmath>
#include <queue>
#define maxn 18
#define eps (1e-7)
typedef long long ll;
int n, m, k;
int wall[55][55][55][55];
int key[55][55][12];
int dx[] = {0,0,-1,1}, dy[] = {1,-1,0,0}; //UDLR
bool Hash[55][55][1030];
using namespace std ;
struct node {
    int x, y, key, st;
    node(int x=0, int y=0, int key=0, int st=0) : x(x), y(y), key(key), st(st) {}
    bool ok() {
        if (x > 0 && x <= n && y > 0 && y <= m) return true;
        return false;
    }
};
queue<node> Q;
int bfs() {
    while (!Q.empty()) {
        node tmp = Q.front();
        Q.pop();
        //system("pause");
        if (tmp.x == n && tmp.y == m) {
            return tmp.st;
        }
        for (int i = 0; i < 4; ++ i) {
            int nx = tmp.x + dx[i], ny = tmp.y + dy[i];
            if (node(nx,ny,0,0).ok()) {
                if (wall[tmp.x][tmp.y][nx][ny] == -1) { //没有门
                    if (key[nx][ny][0]) { //这个地方有钥匙
                        int nkey = tmp.key;
                        for (int j = 1; j <= 10; ++ j) if (key[nx][ny][j]) { //把所有钥匙全捡了
                            nkey |= (1 << (j-1));
                        }
                        if (!Hash[nx][ny][nkey]) {
                            Hash[nx][ny][nkey] = 1;
                            Q.push(node(nx,ny,nkey,tmp.st+1));
                        }
                    }
                    else { //这个地方没钥匙,走过去就行了
                        if (!Hash[nx][ny][tmp.key]) {
                            Hash[nx][ny][tmp.key] = 1;
                            Q.push(node(nx,ny,tmp.key,tmp.st+1));
                        }
                    }
                }
                else { //有门当着
                    int nkey = wall[tmp.x][tmp.y][nx][ny];
                    if ((tmp.key >> (nkey-1)) & 1) { //有钥匙能开门
                        if (!Hash[nx][ny][tmp.key]) {
                            Hash[nx][ny][tmp.key] = 1;
                            Q.push(node(nx,ny,tmp.key,tmp.st+1));
                        }
                    }
                }


            }
        }
    }
    return -1;
}
int main() {
    while (cin >> n >> m >> k) {
        memset(wall, -1, sizeof(wall));
        memset(key, 0, sizeof(key));
        memset(Hash, 0, sizeof(Hash));
        int k;
        cin >> k;
        while (k --) {
            int a, b, c, d, e;
            cin >> a >> b >> c >> d >> e;
            wall[a][b][c][d] = e;
            wall[c][d][a][b] = e;
        }
        cin >> k;
        while (k --) {
            int a, b, c;
            cin >> a >> b >> c;
            key[a][b][0] ++;
            key[a][b][c] ++;
        }
        while (!Q.empty()) Q.pop();
        Q.push(node(1,1,0,0));
        cout << bfs() << endl;
    }
}


好的,下面是 `freegames.maze` 模块的详细注释: ```python """ freegames.maze This module provides functions to create and manipulate mazes. Functions: maze(width, height, complexity=0.75, density=0.75): Create a maze with the given dimensions and complexity/density. Classes: Maze: A maze object that can be displayed and solved using Turtle graphics. """ import random def maze(width, height, complexity=0.75, density=0.75): """ Create a maze with the given dimensions and complexity/density. Parameters: - width (int): the width of the maze in cells. - height (int): the height of the maze in cells. - complexity (float): a value between 0 and 1 that determines the amount of complexity/number of twists and turns in the maze. - density (float): a value between 0 and 1 that determines the amount of density/number of cells that are filled in the maze. Returns: - A 2D list of booleans representing the maze, where True indicates a wall and False indicates a path. """ # Determine the dimensions of the maze in cells. rows = height // 2 + 1 cols = width // 2 + 1 # Create the maze as a 2D list of booleans. maze = [[False] * cols for i in range(rows)] # Fill in the border cells as walls. for i in range(rows): maze[i][0] = maze[i][-1] = True for j in range(cols): maze[0][j] = maze[-1][j] = True # Fill in the maze with walls and paths. for i in range(1, rows - 1): for j in range(1, cols - 1): if random.random() < density: maze[i][j] = True elif i % 2 == 0 or j % 2 == 0: maze[i][j] = True # Carve out the maze starting from the center. start_x, start_y = rows // 2, cols // 2 maze[start_x][start_y] = False cells = [(start_x, start_y)] while cells: current = cells.pop(random.randint(0, len(cells) - 1)) x, y = current neighbors = [] if x > 1 and not maze[x - 2][y]: neighbors.append((x - 2, y)) if x < rows - 2 and not maze[x + 2][y]: neighbors.append((x + 2, y)) if y > 1 and not maze[x][y - 2]: neighbors.append((x, y - 2)) if y < cols - 2 and not maze[x][y + 2]: neighbors.append((x, y + 2)) if neighbors: cells.append(current) neighbor = neighbors[random.randint(0, len(neighbors) - 1)] nx, ny = neighbor if nx == x - 2: maze[x - 1][y] = False elif nx == x + 2: maze[x + 1][y] = False elif ny == y - 2: maze[x][y - 1] = False elif ny == y + 2: maze[x][y + 1] = False maze[nx][ny] = False return maze class Maze: """ A maze object that can be displayed and solved using Turtle graphics. Attributes: - maze (list): a 2D list of booleans representing the maze. - width (int): the width of the maze in cells. - height (int): the height of the maze in cells. - cell_size (int): the size of each cell in pixels. - turtle (turtle.Turtle): the turtle used to draw the maze. - screen (turtle.Screen): the screen used to display the maze. Methods: - __init__(self, maze, cell_size=10): create a new Maze object. - _draw_wall(self, row, col): draw a wall at the given cell. - _draw_path(self, row, col): draw a path at the given cell. - display(self): display the maze using Turtle graphics. - solve(self, start=(0, 0), end=None): solve the maze using the given start and end positions, and return a list of (row, col) tuples representing the solution path. """ def __init__(self, maze, cell_size=10): """ Create a new Maze object. Parameters: - maze (list): a 2D list of booleans representing the maze. - cell_size (int): the size of each cell in pixels. """ self.maze = maze self.width = len(maze[0]) self.height = len(maze) self.cell_size = cell_size self.turtle = None self.screen = None def _draw_wall(self, row, col): """ Draw a wall at the given cell. Parameters: - row (int): the row number of the cell. - col (int): the column number of the cell. """ x = col * self.cell_size y = row * self.cell_size self.turtle.goto(x, y) self.turtle.setheading(0) self.turtle.pendown() for i in range(4): self.turtle.forward(self.cell_size) self.turtle.left(90) self.turtle.penup() def _draw_path(self, row, col): """ Draw a path at the given cell. Parameters: - row (int): the row number of the cell. - col (int): the column number of the cell. """ x = col * self.cell_size + self.cell_size // 2 y = row * self.cell_size + self.cell_size // 2 self.turtle.goto(x, y) self.turtle.dot(self.cell_size // 2) def display(self): """ Display the maze using Turtle graphics. """ if not self.turtle: import turtle self.turtle = turtle.Turtle() self.turtle.hideturtle() self.turtle.speed(0) self.turtle.penup() self.turtle.setheading(0) self.turtle.goto(0, 0) self.turtle.pendown() self.turtle.color('black') self.screen = self.turtle.getscreen() self.screen.setworldcoordinates(0, 0, self.width * self.cell_size, self.height * self.cell_size) for row in range(self.height): for col in range(self.width): if self.maze[row][col]: self._draw_wall(row, col) else: self._draw_path(row, col) self.screen.exitonclick() def solve(self, start=(0, 0), end=None): """ Solve the maze using the given start and end positions, and return a list of (row, col) tuples representing the solution path. Parameters: - start (tuple): a (row, col) tuple representing the starting position. Defaults to (0, 0). - end (tuple): a (row, col) tuple representing the ending position. Defaults to the bottom-right corner of the maze. Returns: - A list of (row, col) tuples representing the solution path. """ if not end: end = (self.height - 1, self.width - 1) queue = [(start, [start])] visited = set() while queue: (row, col), path = queue.pop(0) if (row, col) == end: return path if (row, col) in visited: continue visited.add((row, col)) if row > 0 and not self.maze[row - 1][col]: queue.append(((row - 1, col), path + [(row - 1, col)])) if row < self.height - 1 and not self.maze[row + 1][col]: queue.append(((row + 1, col), path + [(row + 1, col)])) if col > 0 and not self.maze[row][col - 1]: queue.append(((row, col - 1), path + [(row, col - 1)])) if col < self.width - 1 and not self.maze[row][col + 1]: queue.append(((row, col + 1), path + [(row, col + 1)])) return None ``` 以上就是 `freegames.maze` 模块的详细注释,希望能帮助你更好地理解它的实现和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值