最近看到有人问手机图形解锁一共有多少种图案,便想着写个程序解决。
所谓图形锁,是指在一个九宫格中,不重复,不跳过(例如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种。
另外,该问题还可用排列组合的方法解决。