Рубрики

Количество способов сделать мобильную блокировку

Мобильный шаблон — это сетка ячейки 3X3, где рисование определенного шаблона (соединяя определенную последовательность ячеек по порядку) разблокирует мобильный телефон. В этой задаче задача состоит в том, чтобы рассчитать количество способов создания шаблона блокировки с количеством соединений в заданном диапазоне. В общих чертах, нам дан диапазон как min и max, нам нужно указать, сколько шаблонов можно сделать, которые используют как минимум мин ячейку соединения и максимум макс ячейку соединения.

Input  : min = 5, max = 7
Output : 106080
Below are some example patterns

Простое решение состоит в том, чтобы сделать простую DFS, проходя через различные соединения из всех начальных точек. Мы можем оптимизировать, наблюдая симметрию между шаблонами, мы можем рассматривать ячейки 1, 3, 7 и 9 как одинаковые. Точно так же мы можем рассматривать 2, 4, 6 и 8 как одинаковые. Ответ, возвращенный членом той же группы, можно умножить на 4, чтобы получить результат для всех участников.
Следующее, что следует отметить, это то, что приведенные ниже шаблоны недопустимы, потому что переход по какой-либо ячейке недопустим, как показано в ячейках 8 диаграммы ниже и ячейках 5, 6.

Чтобы позаботиться о таких недопустимых перемещениях, в приведенном ниже коде взят массив 2D переходов, в котором хранятся возможные ячейки переходов в массиве переходов. Когда мы вызываем рекурсивно, мы накладываем дополнительное условие, что если мы перемещаемся из одной ячейки в другую, которая включает в себя некоторую прыгающую ячейку, то эта ячейка должна быть уже посещена, чтобы игнорировать недопустимые движения.
В приведенном ниже коде мы сделали рекурсивные вызовы из 1, 2 и 5 только потому, что 1 будет охватывать 3, 5 и 7, а 2 охватит 4, 6 и 8 из-за симметрии.
Смотрите код ниже для лучшего понимания:

C ++

// C / C ++ программа для поиска ряда способов блокировки мобильного телефона
// шаблон
#include <bits/stdc++.h>

using namespace std;

#define DOTS 10

  
// метод для нахождения общего паттерна, начиная с текущей ячейки

int totalPatternFromCur(bool visit[DOTS], int jump[DOTS][DOTS],

                                          int cur, int toTouch)

{

    if (toTouch <= 0)

    {

        // если последняя ячейка, то вернуть 1 путь

        return (toTouch == 0)? 1 : 0;

    }

  

    int ways = 0;

  

    // сделать эту ячейку посещенной перед переходом к следующему вызову

    visit[cur] = true;

  

    for (int i=1; i<DOTS; i++)

    {

       / * если эта ячейка не посещена И

           либо i и cur являются смежными (затем переход [i] [cur] = 0)

           или между клетками обязательно побывать уже (

           затем посетите [jump [i] [cur]] = 1) * /

       if (!visit[i] && (!jump[i][cur] || visit[jump[i][cur]]))

         ways += totalPatternFromCur(visit, jump, i, toTouch - 1);

    }

  

    // сделать эту ячейку недоступной после возвращения из звонка

    visit[cur] = false;

  

    return ways;

}

  
// метод возвращает номер шаблона с минимальным m соединением
// и максимальное число соединений

int waysOfConnection(int m, int n)

{

    int jump[DOTS][DOTS] = {0};

  

    // 2 лежит между 1 и 3

    jump[1][3] = jump[3][1] = 2;

  

    // 8 лежит между 7 и 9

    jump[7][9] = jump[9][7] = 8;

  

    // 4 лежит между 1 и 7

    jump[1][7] = jump[7][1] = 4;

  

    // 6 лежит между 3 и 9

    jump[3][9] = jump[9][3] = 6;

  

    // 5 лежит между 1, 9 2, 8 3, 7 и 4, 6

    jump[1][9] = jump[9][1] = jump[2][8] = jump[8][2]

     = jump[3][7] = jump[7][3] = jump[4][6] = jump[6][4] = 5;

  

    bool visit[DOTS] = {0};

    int ways = 0;

    for (int i = m; i <= n; i++)

    {

        // 1, 3, 7, 9 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit, jump, 1, i - 1);

  

        // 2, 4, 6, 8 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit, jump, 2, i - 1);

  

        ways += totalPatternFromCur(visit, jump, 5, i - 1);

    }

  

    return ways;

}

  
// Код драйвера для проверки вышеуказанного метода

int main()

{

    int minConnect = 4;

    int maxConnect = 6;

  

    cout << waysOfConnection(minConnect, maxConnect);

  

    return 0;

}

Джава

// Java программа для поиска количества способов
// для блокировки мобильного шаблона

class GFG 

{

static int DOTS = 10;

  
// метод для нахождения общего паттерна, начиная с текущей ячейки

static int totalPatternFromCur(boolean visit[], int jump[][],

                                       int cur, int toTouch)

{

    if (toTouch <= 0)

    {

        // если последняя ячейка, то вернуть 1 путь

        return (toTouch == 0) ? 1 : 0;

    }

  

    int ways = 0;

  

    // сделать эту ячейку посещенной ранее

    // переход к следующему звонку

    visit[cur] = true;

  

    for (int i = 1; i < DOTS; i++)

    {

          

    / * если эта ячейка не посещена И

        либо i и cur являются смежными (затем переход [i] [cur] = 0)

        или между клетками обязательно побывать уже (

        затем посетите [jump [i] [cur]] = 1) * /

    if (!visit[i] && (jump[i][cur] == 0 || 

         visit[jump[i][cur]]))

        ways += totalPatternFromCur(visit, jump, 

                                    i, toTouch - 1);

    }

  

    // сделать эту ячейку недоступной

    // после возврата из звонка

    visit[cur] = false;

  

    return ways;

}

  
// метод возвращает номер паттерна с
// минимальное m соединение и максимальное n соединение

static int waysOfConnection(int m, int n)

{

    int [][]jump = new int[DOTS][DOTS];

  

    // 2 лежит между 1 и 3

    jump[1][3] = jump[3][1] = 2;

  

    // 8 лежит между 7 и 9

    jump[7][9] = jump[9][7] = 8;

  

    // 4 лежит между 1 и 7

    jump[1][7] = jump[7][1] = 4;

  

    // 6 лежит между 3 и 9

    jump[3][9] = jump[9][3] = 6;

  

    // 5 лежит между 1, 9 2, 8 3, 7 и 4, 6

    jump[1][9] = jump[9][1] = jump[2][8] = 

                 jump[8][2] = jump[3][7] = 

                 jump[7][3] = jump[4][6] = 

                 jump[6][4] = 5;

  

    boolean []visit = new boolean[DOTS];

    int ways = 0;

    for (int i = m; i <= n; i++)

    {

        // 1, 3, 7, 9 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit, 

                                        jump, 1, i - 1);

  

        // 2, 4, 6, 8 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit,

                                        jump, 2, i - 1);

  

        ways += totalPatternFromCur(visit, 

                                    jump, 5, i - 1);

    }

    return ways;

}

  
// Код драйвера

public static void main(String[] args) 

{

    int minConnect = 4;

    int maxConnect = 6;

  

    System.out.println(waysOfConnection(minConnect,

                                        maxConnect));

}
}

  
// Этот код предоставлен PrinciRaj1992

C #

// C # программа для поиска количества способов
// для блокировки мобильного шаблона

using System;

      

class GFG 

{

static int DOTS = 10;

  
// метод для нахождения общего паттерна, начиная с текущей ячейки

static int totalPatternFromCur(Boolean []visit, int [,]jump,

                                       int cur, int toTouch)

{

    if (toTouch <= 0)

    {

        // если последняя ячейка, то вернуть 1 путь

        return (toTouch == 0) ? 1 : 0;

    }

  

    int ways = 0;

  

    // сделать эту ячейку посещенной ранее

    // переход к следующему звонку

    visit[cur] = true;

  

    for (int i = 1; i < DOTS; i++)

    {

          

    / * если эта ячейка не посещена И

        либо i и cur являются смежными (затем переход [i, cur] = 0)

        или между клетками обязательно побывать уже (

        затем посетите [jump [i, cur]] = 1) * /

    if (!visit[i] && (jump[i, cur] == 0 || 

        visit[jump[i, cur]]))

        ways += totalPatternFromCur(visit, jump, 

                                    i, toTouch - 1);

    }

  

    // сделать эту ячейку недоступной

    // после возврата из звонка

    visit[cur] = false;

  

    return ways;

}

  
// метод возвращает номер паттерна с
// минимальное m соединение и максимальное n соединение

static int waysOfConnection(int m, int n)

{

    int [,]jump = new int[DOTS, DOTS];

   

    // 2 лежит между 1 и 3

    jump[1, 3] = jump[3, 1] = 2;

  

    // 8 лежит между 7 и 9

    jump[7, 9] = jump[9, 7] = 8;

  

    // 4 лежит между 1 и 7

    jump[1, 7] = jump[7, 1] = 4;

  

    // 6 лежит между 3 и 9

    jump[3, 9] = jump[9, 3] = 6;

  

    // 5 лежит между 1, 9 2, 8 3, 7 и 4, 6

    jump[1, 9] = jump[9, 1] = jump[2, 8] = 

                 jump[8, 2] = jump[3, 7] = 

                 jump[7, 3] = jump[4, 6] = 

                 jump[6, 4] = 5;

  

    Boolean []visit = new Boolean[DOTS];

    int ways = 0;

    for (int i = m; i <= n; i++)

    {

        // 1, 3, 7, 9 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit, 

                                        jump, 1, i - 1);

  

        // 2, 4, 6, 8 симметричны, поэтому умножаем на 4

        ways += 4 * totalPatternFromCur(visit,

                                        jump, 2, i - 1);

  

        ways += totalPatternFromCur(visit, 

                                    jump, 5, i - 1);

    }

    return ways;

}

  
// Код драйвера

public static void Main(String[] args) 

{

    int minConnect = 4;

    int maxConnect = 6;

  

    Console.WriteLine(waysOfConnection(minConnect,

                                       maxConnect));

}
}

  
// Этот код предоставлен 29AjayKumar

Выход:

34792

Эта статья предоставлена Уткаршем Триведи . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Количество способов сделать мобильную блокировку

0.00 (0%) 0 votes