关于手机手势解锁共有多少种情况的分析

  • 题目:在九宫格中,任意两个数字可以直接连接,但是某些倾角为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);
    }

}
posted @ 2021-05-23 17:00  Cruel_King  阅读(436)  评论(0编辑  收藏  举报