关于手机手势解锁共有多少种情况的分析
- 题目:在九宫格中,任意两个数字可以直接连接,但是某些倾角为45°和90°的连接有特殊限制,例如,1要和3相连的前提是,2也会被连入。1要和9相连,5也会被连入。现在问题就是要求手势解锁共有多少种设置方案。
解决思路:由于数字一共有九个,因此我们可以使用哈希将那些有特殊限制的点相连的情况存储下来,例如,在2还没有连入的情况下,是不允许1和3相连的,但在2连入的状态下,允许1和3相连。因此,我们将限制情况一 一存储到哈希表中,例如我们存储hash[1][3] = 2。在1要和3连接的时候,我们去判断hash[1][3]是否已经连入,已经连入则1 -> 3是合法的,否则不允许1 -> 3。
import java.util.*;
public class Solution {
static int[][] hash = new int[10][10];
static int step;
static int ans;
static boolean[] vis = new boolean[10];
public static void dfs(int u) {
if(step >= 4) {
ans ++;
}
for(int i = 1; i <= 9; i ++) {
if(!vis[i] && vis[hash[u][i]]) {
vis[i] = true;
step ++;
dfs(i);
vis[i] = false;
step --;
}
}
}
public static void main(String[] args) {
hash[1][3] = hash[3][1] = 2;
hash[1][7] = hash[7][1] = 4;
hash[1][9] = hash[9][1] = 5;
hash[2][8] = hash[8][2] = 5;
hash[3][7] = hash[7][3] = 5;
hash[3][9] = hash[9][3] = 6;
hash[4][6] = hash[6][4] = 5;
hash[7][9] = hash[9][7] = 8;
for(int i = 1; i <= 9; i ++) {
step = 1;
vis[0] = true;
vis[i] = true;
dfs(i);
Arrays.fill(vis, false);
}
System.out.println(ans);
}
}
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!