题目:现有一个 3x3 规格的 Android 智能手机锁屏程序和两个正整数 m 和 n ,请计算出使用最少m 个键和最多 n个键可以解锁该屏幕的所有有效模式总数。
其中有效模式是指:
每个模式必须连接至少m个键和最多n个键;
所有的键都必须是不同的;
如果在模式中连接两个连续键的行通过任何其他键,则其他键必须在模式中选择,不允许跳过非选择键(如图);
顺序相关,单键有效(这里可能跟部分手机不同)。
输入:m,n
代表允许解锁的最少m个键和最多n个键
输出:
满足m和n个键数的所有有效模式的总数
题解很显然,解锁方式最多有∑i=19A9i种,每一种方式处理的时间复杂度是O(9)。
处理某一种方式的时候,只需要判断相邻的两个点的中间是否有点或者有点的情况下他是否已经经过了。
用C++的话使用dfs即可模拟出所有情况。
但是Python有一个很优秀的库itertools里面有permutations函数可以很快速地去枚举所有的方式,只可惜Python速度太慢了,直接计算会TLE,见下面的代码。
class Solution {
public:
/**
* 实现方案
* @param m int整型 最少m个键
* @param n int整型 最多n个键
* @return int整型
*/
int total = 0, M, N;
bool used[10];
int id[10][2] = {
{0, 0}, {1, 1}, {1, 2}, {1,