网站首页 活动公告 礼包中心 攻略指南
首页 >> 活动公告
图形锁可绘制的图案总数计算

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

最近看到有人问手机图形解锁一共有多少种图案,便想着写个程序解决。 所谓图形锁,是指在一个九宫格中,不重复,不跳过(例如132,在2未被...

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

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

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

代码如下:

#include

#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种。

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