377A. Maze

题意

n*m的矩阵#代表墙.代表通路,将k个通路堵住,使得剩下的路是连通的,输出堵完后的图。

解析

很好的一个题目,反向思考,首先累计所有通路的个数 c n t cnt cnt,算出我们还能保留多少的土地 c n t − k cnt-k cntk,找到一个连通块大小大于等于 c n t − k cnt-k cntk的通路,用 b f s bfs bfs标记 c n t − k cnt-k cntk个土地即可, b f s bfs bfs搜索一定是连通的。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int n,m,k;
int r[505][505];
int book[505][505];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int dfs(pii p,int w){
    int f=1;
    int x=p.first,y=p.second;
    book[x][y] =w;
    for(int i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(tx>=1 && tx<=n && ty>=1 && ty<=m && book[tx][ty]!=w && !r[tx][ty]){
            f+=dfs({tx,ty},w);
        }
    }
    return f;
}

int main() {
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            char x;
            cin>>x;
            if(x=='#')r[i][j]=1;
        }
    }
    vector<pair<int,pii>>v;//块的大小+坐标
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!r[i][j] && !book[i][j]){
                int e=dfs({i,j},1);
                v.push_back({e,{i,j}});
            }
        }
    }
    sort(v.begin(),v.end());

    int i=0;
    for(;i<v.size();i++){
        if(k>=v[i].first){
            dfs(v[i].second,2);
            k-=v[i].first;
        }
        else{
            dfs(v[i].second,3);
            break;
        }
    }


    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
//            cout<<book[i][j];
            if(r[i][j]==1)cout<<"#";
            else if(book[i][j]==2)cout<<"#";
            else if(book[i][j]==3 && k>0){
               k--;
               cout<<"X";
            }
            else{
                cout<<".";
            }
        }
        cout<<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、付费专栏及课程。

余额充值