鱼C论坛

 找回密码
 立即注册
查看: 462|回复: 14

怎么求出被包围的部分

[复制链接]
发表于 2024-7-1 17:51:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rt,玩了 https://tileman.io,有感而发,准备也写一个。

1.png

现在遇到了一个最大的问题,如何求出被包围的部分?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-1 17:52:13 | 显示全部楼层
求出被包围的部分,可以用一些常见的计算几何算法。以下是一个相对简单的方法,适合处理一些基本的情况:

### 步骤:

1. **标记所有的边界点**:首先需要标记所有作为边界的点(即那些不被四面八方包围的点)。

2. **遍历标记的点**:从一个边界点开始,进行遍历。

3. **使用洪水填充算法**:
   - 类似于油漆桶工具的工作原理。
   - 选取一个未被包围的区域进行填充,这样就可以找出所有连通的区域。

4. **判断被包围区域**:
   - 如果一个区域在填充的过程中没有接触到边界点,那么它就是被包围的。
   - 如果一个区域在填充过程中接触到了边界点,那么它就是未被包围的。

### 伪代码:
下面是一个简化的伪代码,用来解释以上步骤:
def find_enclosed_areas(grid):
    # 获取网格的尺寸
    rows, cols = len(grid), len(grid[0])
    
    # 定义四个方向:上下左右
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    
    def is_valid(x, y):
        # 检查坐标是否在网格内
        return 0 <= x < rows and 0 <= y < cols
    
    def bfs(start):
        # 使用队列进行广度优先搜索
        queue = [start]
        enclosed = True
        region = []
        
        while queue:
            x, y = queue.pop(0)
            if (x, y) in visited:
                continue
            visited.add((x, y))
            region.append((x, y))
            
            for dx, dy in directions:
                nx, ny = x + dx, y + dy
                if is_valid(nx, ny):
                    if grid[nx][ny] == 0:
                        queue.append((nx, ny))
                else:
                    enclosed = False
        
        return region if enclosed else []
    
    visited = set()
    enclosed_areas = []
    
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == 0 and (i, j) not in visited:
                enclosed_area = bfs((i, j))
                if enclosed_area:
                    enclosed_areas.append(enclosed_area)
    
    return enclosed_areas

# 示例网格:0 代表空白区域,1 代表边界
grid = [
    [1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 1, 0, 1],
    [1, 0, 0, 0, 1],
    [1, 1, 1, 1, 1],
]

print(find_enclosed_areas(grid))

### 解释:
- `grid` 是一个表示地图的二维列表,1 代表边界,0 代表空白区域。
- `bfs` 是一个广度优先搜索函数,用于查找连通区域。
- `enclosed_areas` 是一个存储被包围区域的列表。

希望这些步骤和代码能够帮助你解决如何找出被包围区域的问题!祝你写游戏顺利!如果遇到更多问题,欢迎随时提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 17:55:08 | 显示全部楼层
FishC 发表于 2024-7-1 17:52
求出被包围的部分,可以用一些常见的计算几何算法。以下是一个相对简单的方法,适合处理一些基本的情况:
...

怎么求出 bfs 起始点呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 17:55:47 | 显示全部楼层
歌者文明清理员 发表于 2024-07-01 17:55
怎么求出 bfs 起始点呢?


要找出 BFS(广度优先搜索)的起始点,首先要明确我们寻找的是哪个特定点。这通常取决于你在实现什么功能。这里有几种常见的场景和解决方法:

### 场景1:在一个二维网格中找一个起始点,例如未访问的第一个点
假设你有一个二维网格,其中某些点是已经访问过的,而你想从一个未访问的点开始进行 BFS。网格中的未访问点可以用特定值表示(例如0表示未访问,1表示已访问)。
def find_starting_point(grid):
    rows, cols = len(grid), len(grid[0])
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == 0:  # 0表示未访问
                return (i, j)
    return None  # 如果所有点都已访问过,返回None

### 场景2:在迷宫中找起点和终点
假设你在一个迷宫中,起点和终点可能有特定的标记(例如'S'表示起点,'E'表示终点)。
def find_start_and_end(grid):
    start = None
    end = None
    rows, cols = len(grid), len(grid[0])
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == 'S':  # 'S'表示起点
                start = (i, j)
            if grid[i][j] == 'E':  # 'E'表示终点
                end = (i, j)
    return start, end

### 场景3:在图中找到一个指定的起点
如果你在一个图(使用邻接表表示)中寻找一个指定的起点,起点可能由某些属性或标记确定。
def find_specific_start(graph, start_label):
    if start_label in graph:
        return start_label
    return None  # 如果没有找到起点,返回None

### 使用 BFS 进行搜索
一旦你找到了起始点,可以使用 BFS 进行搜索。以下是一个简单的 BFS 实现:
from collections import deque

def bfs(grid, start):
    rows, cols = len(grid), len(grid[0])
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右
    queue = deque([start])
    visited = set([start])
    
    while queue:
        x, y = queue.popleft()
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < rows and 0 <= ny < cols and (nx, ny) not in visited and grid[nx][ny] == 0:
                queue.append((nx, ny))
                visited.add((nx, ny))
                # 可以在这里处理访问逻辑,例如标记访问或记录路径
    return visited  # 返回所有访问过的点

这个 BFS 示例从一个起始点开始,访问所有可能到达的点并返回所有访问过的点。你可以根据具体需求在BFS过程中添加额外的处理逻辑,例如标记被包围的区域等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 18:25:23 | 显示全部楼层
?什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 18:28:22 | 显示全部楼层

就是图上那个意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 19:04:36 | 显示全部楼层

?面积吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 23:19:37 | 显示全部楼层

求出每个点坐标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 07:25:20 | 显示全部楼层
想问,这个是个什么游戏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 10:07:15 | 显示全部楼层
我觉得吧他是先绘制地图然后在进行游戏部署的。所以每个点的坐标都是确定的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 11:46:42 | 显示全部楼层
学习编程中的Ben 发表于 2024-7-2 10:07
我觉得吧他是先绘制地图然后在进行游戏部署的。所以每个点的坐标都是确定的

对,怎么求出围起来的部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 13:51:45 | 显示全部楼层
问题表述不清,很难针对回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 14:33:43 | 显示全部楼层
python爱好者. 发表于 2024-7-2 13:51
问题表述不清,很难针对回答


获取图中被框住的部分每个点的坐标,已知旁边线条的坐标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 17:25:22 | 显示全部楼层
歌者文明清理员 发表于 2024-7-2 11:46
对,怎么求出围起来的部分

坐标减去坐标呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 22:49:43 | 显示全部楼层
歌者文明清理员 发表于 2024-7-2 14:33
获取图中被框住的部分每个点的坐标,已知旁边线条的坐标

这不就坐标吗,你学一下建系,这种游戏常用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表