图形锁可绘制的图案总数计算

最近看到有人问手机图形解锁一共有多少种图案,便想着写个程序解决。

所谓图形锁,是指在一个九宫格中,不重复,不跳过(例如132,在2未被访问过的情况下不能直接1->3)的连接4个及以上的点为密码。

思路:最基本的DFS。用一个二维数组记录访问过的点,每次遍历数组寻找未访问的点作为终点,然后计算起点终点连线的中点是在九宫格上(坐标由整数构成)。如果在九宫格上,则说明跳过了一个点,此时判断该中点是否访问过,如果访问过则合法,未访问过则非法。如果不在九宫格上,则合法。

代码如下:

#include<iostream>
#define M(dfs) do{Map[i][j] = true;dfs;Map[i][j] = false;}while (0);

bool Map[3][3] = {{false}};
long count = 0;
void dfs(int x, int y, int floor)
{
    if (floor >= 4)
        ++count;
    for (size_t i = 0; i < 3; ++i)
        for (size_t j = 0; j < 3; ++j)
            if (Map[i][j] == false)
                if ((x + i) % 2 != 0 || (y + j) % 2 != 0 || Map[(x + i) / 2][(y + j) / 2] == true)
                    M(dfs(i, j, floor + 1));
}

int main()
{
    for (size_t i = 0; i < 3; ++i)
        for (size_t j = 0; j < 3; ++j)
            M(dfs(i, j, 1));
    std::cout << count;
    return 0;
}

结果为389112种。

另外,该问题还可用排列组合的方法解决。

原文地址:https://www.cnblogs.com/cknightx/p/7459871.html