4 x 3 锁图案

2024-05-08

我遇到了这个.

它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数,并遵循规则。可能有些点不能包含在路径中

有效的模式具有以下属性:

  • 图案可以使用第一次接触的点序列来表示(与绘制图案的顺序相同),从 (1,1) 到 (2,2) 的图案与图案不同从 (2,2) 到 (1,1)。

  • 对于模式表示中的每两个连续的点 A 和 B,如果连接 A 和 B 的线段经过其他一些点,这些点也必须在序列中并且位于 A 和 B 之前,否则该模式将无效。例如,以 (3,1) 开头然后 (1,3) 的模式表示无效,因为该段经过 (2,2),而 (2,2) 在 (3,1) 之前没有出现在模式表示中,而正确的该模式的表示形式为 (3,1) (2,2) (1,3)。但模式 (2,2) (3,2) (3,1) (1,3) 是有效的,因为 (2,2) 出现在 (3,1) 之前。

  • 在模式表示中,我们不会多次提及同一点,即使该模式将通过另一个有效段再次触及该点,并且模式中的每个段都必须从该模式没有的一个点到另一个点。之前不要触摸,它可能会经过模式中已经出现的一些点。

  • 模式的长度是模式表示中每两个连续点之间的曼哈顿距离之和。两点 (X1, Y1) 和 (X2, Y2) 之间的曼哈顿距离为 |X1 - X2| + |Y1 - Y2| (其中 |X| 表示 X 的绝对值)。

  • 图案必须至少接触两个点

我的方法是蛮力,循环遍历点,从该点开始并使用递归递减长度直到达到长度零,然后将1添加到组合数。

有没有办法用数学方程来计算它或者有更好的算法?

UPDATE:这就是我所做的,它给出了一些错误的答案!我认为问题在于isOk功能 !notAllowed是不允许的点的全局位掩码。

bool isOk(int i, int j, int di,int dj, ll visited){
    int mini = (i<di)?i:di;
    int minj = (j<dj)?j:dj;

    if(abs(i-di) == 2 && abs(j-dj) == 2 && !getbit(visited, mini+1, minj+1) )
        return false;
    if(di == i && abs(j - dj) == 2 && !getbit(visited, i,minj+1) )
        return false;
    if(di == i && abs(j-dj) == 3 && (!getbit(visited, i,1) || !getbit(visited, i,2)) )
        return false;
    if(dj == j && abs(i - di) == 2 && !getbit(visited, 1,j) )
        return false;

    return true;
}

int f(int i, int j, ll visited, int l){
    if(l > L) return 0;
    short& res = dp[i][j][visited][l];
    if(res != -1) return res;
    res = 0;
    if(l == L) return ++res;

    for(int di=0 ; di<gN ; ++di){
        for(int dj=0 ; dj<gM ; ++dj){
            if( getbit(notAllowed, di, dj) || getbit(visited, di, dj) || !isOk(i,j, di,dj,  visited) )
                continue;
            res += f(di, dj, setbit(visited, di, dj), l+dist(i,j , di,dj));
        }
    }
    return res;
}

我对另一个问题的回答 https://stackoverflow.com/questions/22621174/calculate-possible-snake-passwords/22622326#22622326也可以适应这个问题。

Let f(i,j,访问过,k)当我们当前位于节点 (i,j) 时,完成部分模式的方法数量,已经访问了集合中的顶点visited到目前为止已走过的路径长度k。我们可以代表visited作为位掩码。

我们可以计算f(i,j,访问过,k)递归地尝试所有可能的下一步动作并应用 DP 来重用子问题解决方案:

f(i,j, 访问过, L) = 1

f(i,j, 访问过, k) = 0 如果 k > L

f(i,j, 访问过, k) = sum(可能的移动 (i', j'): f(i', j', 访问过 UNION {(i',j')}, k + dis((i, j), (i',j')))

可能的移动是那些穿过许多访问过的顶点,然后以未访问过的(且不是禁止的)顶点结束的移动。

If D是禁止顶点的集合,问题的答案是

sum((i,j) 不在 D 中:f(i,j, {(i,j)}, L))。

运行时间类似于 O(X^2 * Y^2 * 2^(X*Y) * 最大可能长度)。我猜最大可能长度实际上远低于1000.

UPDATE:我实施了这个解决方案并且它被接受了。我通过以下方式枚举了可能的移动:假设我们位于点 (i,j) 并且已经访问了顶点集visited。枚举所有不同的互质对 (dx,dy) 0 dx, j + kdy) 仍然是一个有效的网格点并且 P_k 不在visited。如果 P_k 未被禁止,则它是有效的移动。

最大可能的路径长度为 39。

我使用大小为 3 * 4 * 2^12 * 40 的 DP 数组来存储子问题结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4 x 3 锁图案 的相关文章

随机推荐

  • 如何在 MySQL 中存储工作日列表?

    我正在使用编写一个应用程序PHP我需要存储一个独特的工作日列表MySQL 在应用程序中 我有一个数组来存储工作日 如下所示 days Wed Thu Sat 我知道我可以使用SET列 但我不想使用这种类型 因为它与我正在使用的框架 Lara
  • JavaScript 中最大长度的正则表达式

    如何限制与正则表达式匹配的字符串的长度 我假设var sixCharsRegEx 6 7 只匹配长度为 6 或 7 的字符串 but no http jsfiddle net FEXbB http jsfiddle net FEXbB 我缺
  • 如何将 OpenSSL 与 WinSock 一起使用?

    我在网上搜索过 但没有找到任何与此相关的内容 有谁有使用 WinSock 和 OpenSSL 的简单代码示例吗 我正在寻找一个简单的 Visual C 2005 或更高版本的代码示例 它创建并打开一个 Winsock 连接 并使用 Open
  • 我如何在 LibGDX 应用程序中找到软键盘的高度

    我正在开发一个Android游戏与LibGDX 我需要找到用户正在使用的软键盘的高度 因为我想在键盘正上方显示一些对象 我读过这个帖子 如何获取 Android 上的软键盘高度 https stackoverflow com questio
  • 将所有 Docker Swarm 节点作为管理器运行的优点和缺点?

    我正在考虑构建一个 Docker Swarm 集群 为了保持事情既简单又相对容错 我考虑简单地运行 3 个节点作为管理器 不使用任何专用工作节点时有哪些权衡 有什么我应该注意但可能不明显的事情吗 我找到了这个Github问题 https g
  • UISlider最大值调整

    我有三个滑块 这些显示了我需要的不同元素的百分比 所有元素的最大值是 100 a b c 100 现在这些都相互依赖并有助于制作饼图 目前都可以设置为最大值 100 如何从逻辑上使这种依赖性和最大值成为可能 提前致谢 在处理滑块更改的方法中
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • 定义Python字典时,如何使用给定字段的值来计算其他字段?

    考虑代码 a 2 b 3 mylist a a b b product a b 这会生成一个包含三个字段的字典 其中第三个字段是使用第一个和第二个字段的值计算的 我正在寻找更紧凑的定义mylist 我已经尝试过 1 mylist a 2 b
  • Thymeleaf:传递 javascript 参数

    我有一个基本的 SpringBoot 应用程序 使用 Spring Initializer 嵌入式 Tomcat Thymeleaf 模板引擎 并打包为可执行 JAR 文件 我想将 POJO 的属性传递给 javascript 函数 tr
  • 如何使用GDK在卡片上显示静态地图?

    在 Mirror API 中我们可以使用类似的东西 img src height 360 width 240
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 将这个使用 lambda 解包的元组从 Python 2 移植到 Python 3 的最 Pythonic 方法

    我有以下 Python 2 代码 它在 lambda 中解压元组 该 lambda 包含在 for 循环内 for lab lab pred length in zip labels labels pred sequence lengths
  • 使用 Play WS 并获取 java.net.ConnectException:Amazon Cloudfront 上的握手超时

    在我的 Play 应用程序中 我需要从 Amazon Cloudfront 下载大量文件 使用 SSL 我在链接上随机收到以下错误 play api http HttpErrorHandlerExceptions anon 1 Execut
  • 更改文本框中文本的前景色和背景色

    我正在使用 VB NET 制作 C 代码编辑器应用程序 我想在用户键入关键字时更改关键字的颜色 另外 我正在寻找一种方法来突出显示某些代码行 有没有办法更改文本框或富文本框中一段文本的前景色和背景色 我真的不知道你想做什么 所以这里有一些选
  • 与 Java 中的同步块相比,新的 Lock 接口有什么优势?

    与 Java 中的同步块相比 新的 Lock 接口有什么优势 您需要实现一个高性能缓存 允许多个读取器但单个写入器保持完整性 您将如何实现它 锁的优点是 让他们公平是可能的 可以使线程在等待 Lock 对象时响应中断 可以尝试获取锁 但如果
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • 为铁路中的自引用关联建立工厂

    我有一个典型的要求 我必须按如下方式处理用户对象 user referrer and user referrers 基本上 用户可以推荐多个人 并且一个人应该由一位特定用户推荐 所以我按如下方式建立关联 他们工作得很好 class User
  • WCF 每个端点有不同的身份验证方法

    我有 WCF 服务 我的服务有 2 个端点 每个端点都有不同的联系人 该服务使用自定义用户名身份验证 在 的 customUserNamePasswordValidatorType 属性中定义 问题是两个端点将使用相同的身份验证方法 无论如
  • 集群应用程序服务器中的 JMS 主题订阅者如何接收消息?

    假设我创建了一个带有一个订阅者 PropertiesSubscriber 的 JMS 主题 PropertiesTopic PropertiesSubscriber 运行在负载平衡的应用程序服务器集群中 如下图所示 替代文本 http ww
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不