计算可能的“蛇”密码

2023-11-23

我们都知道移动设备上的新密码屏幕。它由要连接的点矩阵组成。

唯一的密码是点的向量。这些点可以连接到自身,但有以下限制:

  • 一个点只能连接到另外 1 个点
  • 如果目标点和空闲点在同一条线上,则线路将被迫连接到更近的点。一个例子:

enter image description here

由于之前没有连接中间点,因此无法将顶部点与底部连接。

第一个限制使其查找树图的数量。这是第二个限制,我找不到计算方法。

有没有更简单的方法来计算可能性的数量,或者唯一的方法是生成所有可能性并计算它们?


由于计数的一般问题简单的路径在无向图中是#P-完成,正如评论中指出的那样,类似的计数问题网格中的自回避路径被推测很难,我认为考虑如何在 o((n*n)!) 时间内解决问题是适当的(在你的情况下 n=3)。

我们必须记住通常适用于“真实”智能手机的额外特殊情况:

  • We can如果已经访问过中间节点,则遍历中间节点。例如,通常可以 (0,0) -> (1,1) -> (0,2) -> (2,0)

有一种简单的动态规划方法应该能够解决至少 5x5 的情况:让f(i,j,访问过)是当我们当前位于顶点 (i,j) 时的路数visited是我们之前访问过的节点集。我们可以计算f通过尝试所有可能的移动和递归来使用动态编程。我们可以代表visited作为位掩码。那么可能性的总数将是sum(i,j, f(i,j, {(i,j)})).

结果如下:

n = 2     64
n = 3     389497
n = 4     4350069824956
n = 5     236058362078882840752465

即使 n = 4,从信息论的角度来看似乎也是相当安全的。

下面是我使用的 C++ 实现。由于结果可能非常大,因此程序会计算它对一些大素数的模,以便我们可以使用中国剩余定理重建解决方案。

#include <bits/stdc++.h>
#include <cassert>
using namespace std;

typedef long long ll;

const int n = 5;
bool getbit(int visited, int i, int j) { return visited & (1<<(i*n + j)); }
int setbit(int visited, int i, int j) { return visited | (1<<(i*n + j)); }
bool inrange(int i) { return 0 <= i && i < n; }
short dp[n][n][1<<(n*n)];
int mod;
int f(int i, int j, int visited) {
    short& res = dp[i][j][visited];
    if (res != -1) return res;
    res = 1;
    for (int di = -i; di <= n-i-1; ++di)
        for (int dj = -j; dj <= n-j-1; ++dj) {
            if ((di == 0 && dj == 0) || abs(__gcd(di, dj)) != 1) continue;
            int i2 = i + di, j2 = j + dj;
            while (inrange(i2) && inrange(j2) && getbit(visited, i2, j2)) {
                i2 += di;
                j2 += dj;
            }
            if (inrange(i2) && inrange(j2)) {
                res += f(i2, j2, setbit(visited, i2, j2));
                if (res >= mod) res -= mod;
            }
        }
    return res;
}

int primes[] = {
    15013,
    15017,
    15031,
    15053,
    15061,
    15073,
    15077,
    15083,
    15091,
    15101,
};

int main(int argc, char **argv) {
    int lo = 0;
    int hi = sizeof primes / sizeof *primes - 1;
    if (argc > 1) {
        stringstream ss; ss << argv[1]; ss >> lo;
        hi = lo;
    }
    for (int p = lo; p <= hi; ++p) {
        mod = primes[p];
        cout << mod << " " << flush;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                for (ll m = 0; m < (1<<(n*n)); ++m)
                    dp[i][j][m] = -1;
        ll answer = 0;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                answer = (answer + f(i, j, setbit(0, i, j))) % mod;
        cout << answer << endl;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算可能的“蛇”密码 的相关文章

  • Python 排列下没有相同元素的集合的笛卡尔积

    我有一些集合 我想对其进行笛卡尔积 效果很好 但是 我想删除这个新集合中在元素排列下相同的所有元素 例如 采用以下代码 import itertools as ittools x 2 y 3 z 5 flist list ittools p
  • N 选择列表的 N/2 个子列表

    Python中有没有一种有效的方法来获取大小列表的所有分区n分成两个大小子集n 2 我想获得一些迭代构造 以便每次迭代提供原始列表的两个不重叠的子集 每个子 集都有大小n 2 例如 A 1 2 3 4 5 6 here n 6 some i
  • 生成单词所有变体的算法

    我想通过以下示例来解释我的问题 假设单词 abc a 有变体 b 没有变体 c 有变体 所以可能的词是 abc bc bc ab b b 现在我正在寻找一种算法 可以打印具有任意字母变体的任意单词的所有单词变体 我建议你递归地解决这个问题
  • Rank 和 unrank 与约束的组合

    我想使用元素距离约束对组合进行排名和取消排名 所选元素不能重复 例如 n 10元素选择 k 5被选择的元素 d 32 个选定元素之间的最大距离 1 3 5 8 9匹配约束条件 1 5 6 7 8与约束不匹配 如何对具有给定距离约束的组合进行
  • 计算 itertools.product() 的第 n 个结果

    我正在尝试计算 itertools product 的第 n 个结果 test list product 01 repeat 3 print test desired output test 0 print desired output 所
  • 二进制序列 x 位长的所有排列

    我想找到一种干净而聪明的方法 在 python 中 来查找 1 和 0 x 字符长的字符串的所有排列 理想情况下 这会很快并且不需要进行太多迭代 所以 对于 x 1 我想要 0 1 x 2 00 01 10 11 etc 现在我有这个 它很
  • 查找多个变量的所有组合总和为 1

    我正在尝试解方程 x1 x2 x3 xn 1 其中所有的值xi仅限于 0 0 1 0 2 0 9 1 目前 我通过首先生成一个n维数组来解决问题mat 其中每个元素位置的值是轴值的总和 其变化范围为axisValues 0 0 1 1 ma
  • 6 个位置内 3 个元素的排列

    我正在寻找排列 或组合 c a b c 在始终具有具有替代元素的序列的条件下的六个位置内 例如abcbab 排列可以很容易地得到 abc lt c a b c permutations n 3 r 6 v abc repeats allow
  • 计算所有 k 乘积之和的高效算法

    假设给你一个列表L of n数字和整数k
  • Haskell 中 2 个列表的笛卡尔积

    我希望在 Haskell 中生成 2 个列表的笛卡尔积 但我不知道该怎么做 笛卡尔积给出列表元素的所有组合 xs 1 2 3 ys 4 5 6 cartProd a gt b gt a b cartProd xs ys gt 1 4 1 5
  • 生成通用列表的组合

    我需要从另一个列表创建一个列表 其中包含所有可能的组合 在研究可能的解决方案时 我发现了许多有趣的方法 但所有方法似乎都是根据提供的记录计数生成结果 我需要将组合增加到最大阈值 即考虑以下数组 1 2 3 4 5 我需要结果看起来类似于 本
  • 查找最多 2 个不同位置的字符串邻居

    给定一个种子字符串 我想找到其邻居最多有 2 个位置不同 生成字符串涉及的所有数字只有四位 即0 1 2 3 这是我的意思的例子 In this example first column are neighbors with only 1
  • 如何获取两个列表之间的所有唯一分配

    我有两个列表 每个列表都可以包含重复的值 但任何值只能出现在这两个列表之一 或没有 中 A 0 1 B 2 3 我想获得这两个列表之间的所有唯一映射 assignment A B 0 2 1 3 0 3 1 2 我知道这可以例如使用 ite
  • 在给定总数、部分数和最大被加数的情况下查找整数分区的数量

    我正在寻找总共 N 个整数分区的数量 其中多个部分为 S 最大部分恰好为 X 而无需枚举所有分区 例如 所有 100 的分区都有 10 个部分 最大部分为 42 我没有找到解决这个问题的定理或分区恒等式 我怀疑这是一个不平凡的问题 不容易从
  • 生成某些向量元素的所有可能组合(笛卡尔积)

    我想生成给定数量的向量的元素的所有可能的组合 例如 对于 1 2 1 2 and 4 5 我想生成元素 1 1 4 1 1 5 1 2 4 1 2 5 2 1 4 2 1 5 2 2 4 2 2 5 问题是我不知道需要计算组合的向量数量 在
  • 从n中生成k个元素的“反灰色”按需组合的算法

    我正在尝试实现一种算法 从一组 n 个元素中获取 k 个元素的所有组合 其中两个连续组合之间的差异最大化 类似于反向格雷码 换句话说 应该对组合进行排序以避免元素连续出现两次 这样就不会不必要地歧视任何元素 理想情况下 该算法也不会预先计算
  • Android 锁密码组合

    我刚刚从我的同事那里听到了这个有趣的问题 我现在正在尝试 但同时我想我可以在这里分享 Android 主屏幕上显示的密码网格中 可能有多少个有效密码 密码最小长度 4 最大 9 如果我错了请纠正我 Summary 4 到 9 个独特数字的完
  • 缺少 Haskell 原语来连续将函数应用于列表的每个元素?

    在 Haskell 中 众所周知map原语可用于将给定函数应用于all列表的元素 gt map toUpper abcd ABCD gt 在尝试生成有限集 列表 的所有分区时 以下类似的原语会很方便 gt sap toUpper abcd
  • 如何以编程方式证明“六度分离”概念?

    我有一个包含 2000 万用户以及这些人之间的联系的数据库 如何证明 六度分离 的概念以最有效的方式在编程中 链接到有关六度分离的文章 http en wikipedia org wiki Six degrees of separation
  • 如何高效生成总和在指定范围内的所有组合(在所有深度)

    假设您有一组值 1 1 1 12 12 16 如何生成总和在预定义范围内的所有可能组合 不重复 min max 例如 这里是 所有深度的 范围在13 and 17 1 12 1 1 12 1 1 1 12 16 1 16 这假设具有相同值的

随机推荐

  • 将 REINSTALLMODE 传递到 MSI 文件

    我正在使用 VisualStudio2005 和 vdproj 创建一个简单的 MSI 文件 当我启动它时 我需要传入 REINSTALLMODE 属性 我知道这可以通过命令行完成 如下所示 msiexec exe i foo msi RE
  • 使用 data.table 加速 rollapply

    我是 data tables 的新手 所以如果这是一个非常基本的问题 我深表歉意 我听说 data tables 在处理大量数据时显着提高了计算时间 因此想看看 data table 是否能够帮助加快 rollapply 函数的速度 如果我
  • Rails 3 link_to 路由(编辑)嵌套资源

    抱歉 如果其他地方有人问过这个问题 但我无法弄清楚 我有一个包含版块 主题和回复的论坛 我正在尝试从显示主题视图中编辑和删除回复 这是结构 resources sections do resources topics do resource
  • 如何将静态二维数组的指针传递给结构/类?

    当我尝试将数组的指针 其中包含程序中某些函数所需的参数 传递给结构时遇到问题 然后该结构应该传递给这些函数 例如 GSL 希望我以这种方式传递参数 一个小示例程序如下所示 include
  • 如何展开使用 R 中的 igraph 包制作的社区图

    尝试在推文数据中查找社区 不同单词之间的余弦相似度形成邻接矩阵 然后 我根据该邻接矩阵创建了图 图表的可视化是这里的任务 Document Term Matrix dtm DocumentTermMatrix tweets adjust t
  • 对静态文件的请求正在命中 ASP.NET MVC3 中的托管代码

    创建自定义 IHttpModules 时 我意识到对静态文件 例如 css 和 js 文件 的请求正在访问托管模块 可能图片也有同样的问题 IIS 不应该绕过 ASP NET 来获取文件系统中存在的文件吗 例如 public class M
  • 如何将字符串中的空格分隔数字序列转换为整数

    我正在尝试使用将字符串元素转换为整数stoiC 11 中的函数并将其用作参数pow函数 像这样 include
  • Android应用程序更新通知

    我一个月前将我的应用程序上传到 Android 市场 现在我已经上传了它的新版本 我的设备上安装了旧版本 但我没有收到更新通知 当我将应用程序更新到 Android Market 时 是否有任何选项可以向用户发送更新通知 不是默认情况下 市
  • 我应该通过任何方式避免 Django 中的多表(具体)继承吗?

    许多经验丰富的开发人员建议不要使用Django多表继承由于其性能不佳 Django 陷阱 具体继承 by 雅各布 卡普兰 莫斯 Django 的核心贡献者 几乎在所有情况下 抽象继承都是更好的方法 长期来看 我见过不少网站在负载下崩溃了 通
  • 如何使用 Java 邮件发送 html 消息

    我一直在从 Java 发送简单的电子邮件 没有问题 但我现在尝试发送一封 html 电子邮件 如下所示 MimeMessage message new MimeMessage Email getSession message setFrom
  • 如何在 Eclipse Mars 中禁用 css 警告“未知属性”?

    我在 css 文件中收到许多 未知属性 警告 这可能是由于我安装了 e fx clipse 2 0 和 Eclipse Web Developer Tools 如果我使用 e fx clipse css 编辑器打开 css 文件并添加 抑制
  • 删除特定字符串后的所有内容(文本的其余部分)

    我怎样才能删除像 gnirts 这样的字符串后面的所有内容 这可能会让您更好地理解 Before 之后 使用查找和替换 按 CTRL H 打开替换对话框 输入 gnirts 到Find what leave Replace with emp
  • 在不同的 .NET 框架之间共享记录器

    我正在创建一个可以在 Net Core 1 2 Net Core 2 0 和 NET Framework 4 6 之间共享的应用程序框架 所以我选择我的项目的目标框架为 NET Standard 在我的框架项目中 我有用于发送短信或电子邮件
  • 查找 Maven 模块化项目中未使用的代码

    我必须清理一个旧项目 一般知识是该项目包含许多我们可以删除的未使用的代码 这将减少一些麻烦并使维护变得更容易 我发现 Eclipse Core Tools 插件看起来是一个很棒的工具 但在我们的例子中 我们有一个 Maven2 项目 它分为
  • 使用 Mockito 模拟局部范围对象的方法

    我需要一些帮助 Example void method1 MyObject obj1 new MyObject obj1 method1 我想嘲笑obj1 method1 在我的测试中 但为了透明 所以我不想制作和更改代码 Mockito
  • 如何在OpenLayers中获取多边形的坐标

    我一直在寻找如何确定 OpenLayers 中组成多边形 要素 的点的坐标 假设我创建了一个像下面这样的多边形this例子 我需要知道组成多边形的点 这样我就可以将它们保存在某个地方 我敢打赌这很容易 我只是找不到任何东西 可能我不知道我应
  • ARM 未对齐内存访问解决方法

    我必须将源代码移植到运行 Linux 的 ARM 平台 不幸的是我遇到了未对齐的内存访问问题 源代码大量使用指针转换和访问 像下面这样的代码已经像病毒一样在代码库中传播 多亏了 gcc 我可以查明有问题的位置 Wcast align命令行选
  • scipy.io.wavfile.read 无法读取 24 位 .wav 文件

    看起来scipy io wavfile read无法读取 24 位 wav 文件 您知道如何处理它们吗 如果您的 wav 文件未压缩 您可以尝试readwav函数在这里 https gist github com WarrenWeckess
  • WordPress:媒体库网格模式无限加载

    所以这个问题很奇怪 因为对我来说 Wordpress 媒体库在仅网格模式下的 WordPress 管理菜单中不起作用 这是非常奇怪的问题 因为这个问题仅发生在 1 个帐户上 这将是昨天我尝试上传一堆的帐户 将图片添加到媒体库后出现错误 稍后
  • 计算可能的“蛇”密码

    我们都知道移动设备上的新密码屏幕 它由要连接的点矩阵组成 唯一的密码是点的向量 这些点可以连接到自身 但有以下限制 一个点只能连接到另外 1 个点 如果目标点和空闲点在同一条线上 则线路将被迫连接到更近的点 一个例子 由于之前没有连接中间点