首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在M x N大小的格网上随机生成自回避多边形

自回避多边形(Self-Avoiding Polygon)是指在M x N大小的格网上生成的多边形,其所有边都不相交,且多边形的每条边都只与格网的边平行或垂直。生成自回避多边形是一个复杂的问题,涉及到随机游走和图论的概念。

基础概念

  1. 格网:一个二维平面被划分为M行N列的小方格。
  2. 自回避:多边形的边不相交,且每条边只能沿着格网的边界移动。
  3. 随机游走:在格网上随机选择一个方向移动,直到形成闭合的多边形。

相关优势

  • 模拟自然现象:自回避多边形可以用来模拟生物分子链、聚合物等自然现象。
  • 图形生成:在计算机图形学中,用于生成复杂的几何形状。
  • 算法研究:作为图论和随机过程研究的经典问题。

类型

  • 简单多边形:没有自交的多边形。
  • 复杂多边形:包含多个环或多个连通分量的多边形。

应用场景

  • 生物信息学:模拟DNA链的结构。
  • 计算机图形学:生成复杂的纹理和图案。
  • 路径规划:在机器人导航中避免障碍物。

生成算法

一种常见的方法是使用随机游走算法,具体步骤如下:

  1. 初始化:选择一个起始点。
  2. 随机移动:从当前点随机选择一个相邻的未访问点移动。
  3. 检查自回避条件:确保新移动的点不会导致边相交。
  4. 闭合多边形:当回到起始点时,形成一个闭合的多边形。

示例代码(Python)

以下是一个简单的Python示例,用于在M x N的格网上生成自回避多边形:

代码语言:txt
复制
import random

def is_valid_move(x, y, M, N, visited):
    return 0 <= x < M and 0 <= y < N and not visited[x][y]

def generate_self_avoiding_polygon(M, N):
    visited = [[False] * N for _ in range(M)]
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # Right, Down, Left, Up
    
    # Start at a random point
    x, y = random.randint(0, M-1), random.randint(0, N-1)
    visited[x][y] = True
    path = [(x, y)]
    
    while True:
        next_moves = []
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if is_valid_move(nx, ny, M, N, visited):
                next_moves.append((nx, ny))
        
        if not next_moves:
            break
        
        nx, ny = random.choice(next_moves)
        visited[nx][ny] = True
        path.append((nx, ny))
        x, y = nx, ny
        
        # Check if we have returned to the start
        if (x, y) == path[0] and len(path) > 3:
            break
    
    return path

# Example usage
M, N = 10, 10
polygon = generate_self_avoiding_polygon(M, N)
print(polygon)

可能遇到的问题及解决方法

  1. 陷入死循环:如果算法长时间无法找到有效的移动方向,可能会陷入死循环。
    • 解决方法:设置最大迭代次数,超过次数则重新开始生成。
  • 多边形不闭合:有时生成的多边形可能不会回到起始点。
    • 解决方法:在生成过程中检查是否回到起始点,并确保路径长度足够长以形成闭合多边形。
  • 效率问题:在大规模格网上生成自回避多边形可能非常耗时。
    • 解决方法:使用更高效的算法或并行计算来加速生成过程。

通过上述方法和代码示例,可以在M x N大小的格网上生成自回避多边形,并解决常见的生成问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 X 或者是一

2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量。...战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。...两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。 输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".","."...时间复杂度:O(N**2)。 代码用rust编写。代码如下: fn main() { let m: Vec> = vec![ vec!['X', '....for i in 0..m.len() { for j in 0..m[0].len() { if m[i][j] == 'X' && (i == 0 || m[

38030

2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X‘ 或者是一个空位 ‘.‘ ,返回在甲板 b

2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量。...战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。...两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。 输入:board = ["X",".",".","X",".",".",".","X",".",".",".","X"]。...甲板上的战舰。 来自米哈游。 答案2022-04-22: 并查集或者岛问题都行,但这不是最优解。 数战舰的左上角,统计左上角的点的个数就行。 时间复杂度:O(N**2)。 代码用rust编写。...for i in 0..m.len() { for j in 0..m[0].len() { if m[i][j] == 'X' && (i == 0 || m[

33510
  • 2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯的

    2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯的位置组成的二维数组 lamps 其中 lamps[i] = [rowi,...coli] 表示 打开 位于 grid[rowi][coli] 的灯 即便同一盏灯可能在 lamps 中多次列出,不会影响这盏灯处于 打开 状态 当一盏灯处于打开状态,它将会照亮 自身所在单元格 以及同一...行 、同一 列 和两条 对角线 上的 所有其他单元格 另给你一个二维数组 queries ,其中 queries[j] = [rowj, colj] 对于第 j 个查询,如果单元格 [rowj, colj...在第 j 次查询之后 [按照查询的顺序] 关闭 位于单元格 grid[rowj][colj] 上 及相邻 8 个方向上(与单元格 grid[rowi][coli] 共享角或边)的任何灯。...y = queries[i][1]; ans[i] = (row[x] || col[y] || leftUpDiag[x - y + n - 1] || rightUpDiag[x

    24330

    2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角

    2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子你有 n 颗球。箱子的顶部和底部都是开着的。...箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。...将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。...返回一个大小为 n 的数组 answer ,其中 answeri 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1。..., ans);}fn find_ball(grid: &mut Vec>) -> Vec { let n = grid.len() as i32; let m =

    44810

    数独的暴力回溯解法和Python GUI版

    数独示例及其二维数组表示 回溯的思路是:从第一个挖空的单元格开始,根据其相关20格(本行、本列及所在宫内的单元格)生成候选数列表lst,lst的生成直接地利用了唯余法进行排除,对列表lst中的值进行向下尝试..._b]),']') 对于上面的最难数独,在本机上求解效果如下,耗时在秒级,回溯性能也不是很差。 ? 网上再找几个数独进行测试,各自耗时如下: ?...直接随机某个位置随机填入一个数字再随机其他位置来生成数独效率并不高,比较合理的做法是程序内部有几个完整的数独,通过数字置换和随机挖空来产生新的数独。...由数独的特点可以推出新生成的数独也是符合规则的。 挖空操作就是随机挖去n处的值,再验证是否有唯一解,就可以生成一个数独题目了。...#…… root.mainloop() 打包GUI为exe文件 还是用pyinstaller把程序变成exe可执行文件,大小8.35M,作为Python导出的exe文件,这个大小是有优势的,结果如下:

    1.5K20

    matlab计算机仿真与蒙特卡洛法【数学建模】

    前言:在计算机出现之前,我们对数学模型的研究只能通过数学推导和实验研究两种方法。在此之后,我们可以通过在计算机上对实际问题的模拟、仿真求解模型。...代码: clc,clear,close n = 240; x = zeros(4,n); y = zeros(4,n); dt = 0.05;%时间间隔 v =10;%速度 x(1,1) = 100;...如在计算不规则多边形的面积时,我们就可以在规则多边形中生成均匀分布的随机数,通过计算随机数出现在不规则多边形的面积的期望值来计算不规则多边形的面积。...= 100000;%产生随机点的数目 p = rand(n,2); x = p(:,1)+1;%横坐标范围 y = 2*p(:,2);%纵坐标范围 y1 = sqrt(4-x.^2); y2 = sqrt...(1-x.^2/4); y3 = sqrt(x.^2-1); L = find(y=y2&y<=y3); m = length(L); s = 2*m/n;%计算面积 plot(x(L)

    2.3K30

    python库之–turtle,matplotlib,numpy,opencv,os,pillow

    引言 下面部分为本人初窥python的世界有感所作。 在学python之前,我总觉得这个东西很玄乎,而且认为网上传的很邪门:几行画出一个函数图,几十行做出一个人物形象,几十行写出一个小游戏。...turtle的原(wan)理(fa): 想象一只小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,在窗体正中心,在画布上游走,它走过的轨迹就形成了绘制的图形。...当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 turtle.end_poly() # 返回最后记录的多边形。...它的每个取值范围为0-255整数或者0-1小数,三种颜色不同的取值就构成了不同的颜色,具体的某个颜色可以网上搜出来表来对照。...+ "\\"+file,img) print(n)#查看循环情况 123456789101112 #把图片全部剪切为100*100格式存到img_v2/save目录下 循环时也以100为步长 这样会调整精度

    2.1K21

    visualgo学习与使用

    0的遍历 如果当前元素j>X 将排序过的元素向右移一格 跳出循环并在此插入X 归并排序 伪代码 将每个元素拆分成大小为1的分区 递归地合并相邻的分区 遍历i=左侧首项位置到右侧末项位置...它可以在O(m)的时间内完成字符串匹配操作,其中m为模式串的长度。 ---- 17. 后缀数组 后缀数组是一种用于处理字符串排序和匹配的数据结构。...它可以在O(n log n)的时间内完成排序操作,比后缀树更加高效。 ---- 18. 计算几何 计算几何是一种研究空间中的几何形体和其性质的学科。...在算法竞赛中,计算几何常用于解决求凸包、最近点对等问题。 周长计算 面积计算 ---- 19. 凸体船体 凸体船体是指在一个二维平面上,由一组点构成的最小凸多边形。...它可以在O(m√n)的时间内完成匹配操作,其中m为边数,n为节点数。 ---- 22. 最小顶点覆盖 最小顶点覆盖是指在一个无向图中,找到一个包含所有边所连接节点的最小节点集合。

    37610

    2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)

    现在lyf要完成的任务是要完成m次询问,每次给出一对坐标(x, y),要判断出(x, y)是否在给出的多边形内。 请帮lyf解决这个问题吧。 Input 有多组数据(组数<=10)。...每组数据输入形如: n m x1 y1 x2 y2 .... xn yn askX1 askY1 askX2 askY2 ... askXm askYm n(3 n 多边形轮廓上的点个数...m (1 m 在多边形内,注意如果在多边形的边上,也认为在多边形内部。...于是有一天,他心血来潮想算一下他的寝室能够生成垃圾的期望数量,问题如下:   我们把仓鼠的寝室抽象成一个1行n列的网格图,在这个网格图中会随机生成垃圾,每个垃圾占x个连续的网格,垃圾不能放到网格图外,也不能相互重叠...比如说n = 3, x = 2,会生成如下两种情况: ? 请你帮仓鼠计算一下生成垃圾的期望数量。

    1.5K70

    CYaRon — OI 测试数据生成利器

    CYaRon 是一个用于生成随机测试数据的 Python 库,内置多种数据结构,例如随机图、树、向量、字符串、数列、多边形等,可以帮助生成有一定强度的测试数据。...,方便您可以使用1E4一类的数来表示数据大小 _m = ati([0, 11, 100, 1E4]) # 这是一个图论题的数据生成器,该题目在洛谷的题号为P1339 for i in range(1...三组测试数据 n = _n[i] # 点数 m = _m[i] # 边数 s = randint(1, n) # 源点,随机选取一个 t = randint(1, n...) # 汇点,随机选取一个 test_data.input_writeln(n, m, s, t) # 写入到输入文件里,自动以空格分割并换行 graph = Graph.graph(...n, m, weight_limit=5) # 生成一个n点,m边的随机图,边权限制为5 test_data.input_writeln(graph) # 自动写入到输入文件里,默认以一行一组u

    1.9K10

    用Nodejs爬取Matrix67的博客

    趣题:构造点集使得每条直线上的点都一样多 高度对称的多面体和它们的对偶多面体 趣题:用两枚硬币随机生成 1 到 n 之间的整数 45 道 Bongard 问题:寻找图形分类的依据 趣题:圆内接八边形的面积...趣题:不用三角函数求出∠BAC的度数 趣题:如何在数据库中秘密地查询隐私数据 趣题:设计多边形围墙使得对于某一观察点所有的墙都不完全可见 趣题:不用乘法实现 (1 + x + x^2 + x^4) mod...趣题:选出最多的大小为奇数的子集,使得两两的交集大小都是偶数 趣题:所有人手上的糖数最终会变得一样多 用生命游戏来模拟生命游戏 经典证明:能否在平面上写下不可数个不相交的Y?...瓶魔悖论与不完全信息 经典证明:用信息熵证明素数无穷多 Geek的收藏:印满圆周率的纸钱包 10个精彩的智力问题 一个有趣的智力题:机智巧妙的楼顶逃生 算法问题征解:怎样生成随机数而不借助任何工具?...非常奇妙的证明:图形必在格点之外 原创科普说明文:递归 聆听圆周率的声音 判定被7整除的简易方法 谬论:所有角都是直角

    1.1K20

    大学课程 | 《算法分析与设计》笔记

    程序与算法的区别:程序可以不满足算法的第四点性质即有限性。例如操作系统,是在无限循环中执行的程序。...矩阵乘法 对于方阵(n*n)A,B,C,有C=A*B,将它们都分块成4个大小相等的子矩阵,每个子矩阵都是(n/2)*(n/2)的方阵 2.7 合并排序 PYTHON def merge(arr,left...),最坏情况下的时间复杂度是O(n^2) 2.9 线性时间选择 找出一组数中,第X大(小)的数 采用了随机划分算法 2.10 最近点对问题 时间复杂度分析O(nlogn) PYTHON """ Copyright...I+1中的状态通过状态转移方程得来,与其他状态没有关系,特别是与未发生的状态没有关系 动态规划算法有一个变形方法——备忘录方法,这种方法不同于动态规划算法“自底向上”的填充方向,而是“自顶向下”的递归方向...贪心算法:总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑它所作出的选择只是在某种意义上的局部最优选择。

    1.1K30

    Kaggle冠军告诉你,如何从卫星图像分割及识别比赛中胜出?

    王小新 编译自 Kaggle 量子位 出品 | 公众号 QbitAI 在2016年12月至2017年3月期间,Kaggle网站举办了一场对英国国防科学与技术实验室(DSTL)提供的卫星图像进行场景特征检测的图像分割比赛...我使用不同大小的滑动窗口,对A频段和M频段的图像分开处理。另外,我还在一些融合模型中对小样本类别进行过采样操作。关于滑动窗口的详细参数如下: ?...就网络所用的数据频段来说,我主要使用灰度图、RGB图像和多光谱M频段,也使用了短波红外A频段。对于A频段,我没有使用所有的通道,而是随机选择几种通道,以节省训练时间和内存占用。...图5:10类对象的全部网络模型表2 在交叉验证方面,我根据不同类别,使用了10%到20%的随机图像块,大样本类别比例更高。对于过采样的小样本类别,只使用5%的随机图像块。...除了树木之外,其他的类别都没有近似值,所以在转换为WKT格式之前,我首先将树木类别重新调整为1550 x 1550,这样能有效地逼近多边形。 你的硬件配置是怎样的?

    2.8K90

    【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

    , 使用 Python 3.9 开发 ; 一、Graham 凸包扫描算法 1、凸包概念 凸包概念 : 在二维平面中 , 包围点集的最小凸多边形 , 其顶点集包含了给定点集中的所有点 , 并且不存在任何一条线段可以穿过这个多边形的内部而不与多边形的边界相交...扫描法 Jarvis 步进法 快速凸包算法 3、Graham 凸包扫描算法 在二维平面上给出一个有限个点的点集 , 其坐标都为 (x , y) ; Graham 格雷厄姆 凸包扫描算法 , 可以找到上述点集的...# 界面为 800x600 , x 方向上在 50 ~ 750 之间生成点, y 方向上在 50 ~ 550 之间生成点 def generate_points(num_points): points...= [] for _ in range(num_points): x = random.randint(50, 750) # 生成 x 坐标范围在 50 到 750 之间的随机数...y = random.randint(50, 550) # 生成 y 坐标范围在 50 到 550 之间的随机数 points.append(Point(x, y))

    37210

    iOS多边形马赛克的实现(下)

    上一篇里我们详述了多边形马赛克的实现步骤,末尾提出了一个思考:如何在涂抹时让马赛克逐块显示呢? 再回顾一下多边形马赛克的实现。首先进行图片预处理,将原图转成bitmap后生成铺满马赛克的全图。...多边形相交的运算是十分复杂的,考虑到我们的马赛克模块还是在cpu上计算,如何让整个过程的复杂度降低成为必须要考虑的问题。...给左图设置的重心是(0.25, 0.5),右图的重心是(0.75, 0.5)。考虑到素材会缩放以调整单位马赛克大小,这里的x, y分别以素材的宽高为基准。...可以看到取中心点生成的马赛克图片似乎更鲜活一些。当然如果一定要取马赛克区域的平均rgb值也是可以的,在预处理的时候事先计算好每个马赛克块的平均颜色即可。 ?...可以看到,由于列间距只有单元格高度的0.5倍,因此我们在计算单元格行数和列数的时候最好是在首尾各预留一行/列以免边缘地方出现遮盖不到的情况(考虑一下行/列间距如果小于0.5是否会有问题?) ?

    1.7K130

    通过编写扫雷游戏提高你的 Bash 技巧

    首先,我先生成了一些随机数字。这将是地雷在雷区里的位置。控制地雷的数量,在开始编写代码之前,这么做会容易一些。实现这一功能的逻辑可以更好,但我这么做,是为了让游戏实现保持简洁,并有改进空间。...(我编写这个游戏纯属娱乐,但如果你能将它修改的更好,我也是很乐意的。) 下面这些变量在整个过程中是不变的,声明它们是为了随机生成数字。...玩家输入 h6,游戏界面会出现一些随机生成的值。在发现地雷后,这些值会被加入用户得分。 图片.png 还记得我们开头定义的变量,a - g 吗,我会用它们来确定随机生成地雷的具体值。...所以,根据玩家输入坐标,程序会根据(m)中随机生成的数,来生成周围其他单元格的值(如上图所示)。之后将所有值和初始输入坐标相加,最后结果放在 i(计算结果如上)中。...m=$(shuf -e a b c d e f g X -n 1) # 将 X 添加到随机列表中,当 m=X,游戏结束 if [[ "$m" !

    1.2K20

    模拟试题A

    ( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点中,正确的是( ) A)从每个多边形出发,根据其对应像素深度大小比较,严格按自远到近顺序进行显示...B)以视区每个像素为处理对象,严格按自远到近顺序进行显示 C)从每个多边形出发,根据其对应像素深度大小比较,可按任意顺序进行显示 D)以视区每个像素为处理对象,可按任意顺序进行显示 3...7.假设场景中有k个多边形构成,显示分辨率为m*n,则图像空间消隐算法的算法复杂度为 ( ) A)k*k B)m*n C)m*n*k D)m*n*k*k 8.如图B.1所示,则反射方向矢量R为(...9.如图B.1所示,则不完全镜面反射光Is 的计算式 ? 中θ为( ) A)N与H的夹角 B)R与N的夹角 C)R与V的夹角 D)R与H的夹角 ?...任意的简单多面体,其面(F)、边(E)、顶点(V)的数目需满足的公式为 。 3. 显示器分辨率m*n,颜色数K与显存大小V之间的关系式为 。 4.

    3.6K10
    领券