计算可能的“蛇”密码

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:用字符序列查找所有可能的单词组合(分词)

    我正在做一些分词实验 如下所示 lst是一个字符序列 并且output是所有可能的词 lst a b c d def foo lst return output output a b c d ab c d a bc d a b cd ab
  • 获取字符串的每个组合

    我有一个组合学作业 涉及从特定的字符串组合中获取长度小于或等于 6 的每个单词 在本例中 它是 S a ab ba 教授刚刚开始列出它们 但我认为用程序来解决会更容易 唯一的问题是我无法得到一个好的算法来实际计算每个可能的选项 如果有人可以
  • 生成单词所有变体的算法

    我想通过以下示例来解释我的问题 假设单词 abc a 有变体 b 没有变体 c 有变体 所以可能的词是 abc bc bc ab b b 现在我正在寻找一种算法 可以打印具有任意字母变体的任意单词的所有单词变体 我建议你递归地解决这个问题
  • 随机且唯一的子集生成

    假设我们有从 1 到 25 的数字 我们必须选择 15 个数字的集合 如果我没猜错的话 可能的集合是 3268760 在这 3268760 个选项中 您必须生成 100000 个 生成 100000 个唯一且随机的子集的最佳方法是什么 有没
  • 二进制序列 x 位长的所有排列

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

    我正在将 python 程序重写为 Rust 并且正在努力翻译这一行 itertools product range 0 8 repeat n 我想要实现的是这样的 https pastebin com ceEA5E3q https pas
  • 一种生成数据集中项目配对的所有可能方式的有效方法

    这在某种程度上是一个组合问题 我正在尝试找出一种有效的方法来配对数据集中的所有项目 例如 我有一个长度为 6 的数组 1 2 3 4 5 6 我想对数组中的内容进行所有可能的配对 如下所示 1 2 3 4 5 6 1 2 3 5 4 6 1
  • 我们可以通过多少种方式从 n 个元素的集合中选取 K 个元素来形成数字 X?

    有一点很重要 我们可以选择任意数量的任何元素 次 但总选取的元素应等于 K 例如 如果元素集为 1 2 3 5 并且 K 3 且 X 4 那么答案是 1 因为只有一种方法可以选择 3 个元素 加起来为 4 而这 3 个元素是两个 1 和一个
  • 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 和 k 的所有序列

    给定 n 和 k 我需要生成以下所有序列 n 5 k 2 0 1 2 0 1 3 0 1 4 1 2 3 1 2 4 2 3 4 另一个例子 n 5 k 3 0 1 2 3 0 1 2 4 0 1 3 4 0 2 3 4 1 2 3 4 我
  • 二项式系数的计算算法

    我需要一种在不耗尽内存的情况下计算组合的方法 这是我到目前为止所拥有的 public static long combination long n long k nCk return divideFactorials factorial n
  • 在给定总数、部分数和最大被加数的情况下查找整数分区的数量

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

    我正在尝试从数字数组中生成所有有效的数字组合 假设我们有以下内容 let arr 1 2 9 4 7 我们需要输出这样的内容 1 2 9 4 7 1 2 9 47 1 2 94 7 1 2 947 1 29 4 7 1 29 47 1 29
  • 如何找到最佳字符串内容,使字符计数向量与其参考字符串的 MSE 最小化

    我有以下参考序列 ref seq lt MGHQQLYWSHPRKFGQGSRSCRVTSNRHGLIRKYGLNMSRQSFR 和这个种子模式字符串 seed pattern lt FKDHKHIDVKDRHRTRHLAK 该模式中有 1
  • TSP的一种变体:限制时间,访问尽可能多的节点

    让我们再次使用推销员上下文 如果销售员不需要拜访所有客户 但有时间限制 他必须拜访尽可能多的客户 我们怎样才能找到最佳路线 一个更高级的版本是 假设每个客户都被标记为货币收益 因此我们的销售人员希望最大化他实际访问的那些客户的总货币收益 只
  • 缺少 Haskell 原语来连续将函数应用于列表的每个元素?

    在 Haskell 中 众所周知map原语可用于将给定函数应用于all列表的元素 gt map toUpper abcd ABCD gt 在尝试生成有限集 列表 的所有分区时 以下类似的原语会很方便 gt sap toUpper abcd
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N

随机推荐

  • 将 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 个点 如果目标点和空闲点在同一条线上 则线路将被迫连接到更近的点 一个例子 由于之前没有连接中间点