C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

モバイルキーパッドによって形成されたすべてのn桁のパターンをC++で印刷します


この問題では、番号nが与えられ、モバイルキーパッドボタンを押して形成されたすべてのN桁のパターンを印刷する必要があります。ボタンを押している間は、現在のボタンの近くのボタンのみを押すことができます。つまり、左、右、上、下のキーのみを押すことができます。

古いキーパッドがどのように見えるか見てみましょう-

1 2
ABC
3
DEF
4
GHI
5
JKL
6
MNO
7
PQRS
8
TUV
9
WXYZ
* 0
問題を理解するために例を見てみましょう

Input: n=2
Output: 12 14 21 23 25 32 36 41 45 47 52 54 56 58 63 65 69 74 78 85 87 89 80 96 98

この問題を解決するために、深さ優先探索(DFS)を使用します。 DFSでは、キーパッドのすべてのキーを数字の最初の桁として1つずつ選択します。次に、DFSを使用して数値の残りの桁を生成します(これにより、左、右、上、または下が可能になります) キーストローク)。

上記のソリューションを実装するためのプログラム-

#include <bits/stdc++.h>
using namespace std;
bool isSafe(int x, int y, bool Visited[][3]) {
   return (x >= 0 && x < 4 && y >= 0 && y < 3 && !Visited[x][y]);
}
void searchNumber(bool visited[][3], int Keypad[][3], int n, string pattern, int x, int y) {
   pattern.push_back((Keypad[x][y] + '0'));
   if (pattern.size() == n) {
      cout<<pattern<<"\t";
      return;
   }
   static int row[] = { 0, 1, 0, -1 };
   static int col[] = { 1, 0, -1, 0 };
   visited[x][y] = true;
   for (int k = 0; k < 4; k++)
      if (isSafe(x + row[k], y + col[k], visited) && Keypad[x + row[k]][y + col[k]] != -1)
   searchNumber(visited, Keypad, n, pattern, x + row[k], y + col[k]);
   visited[x][y] = false;
   pattern.pop_back();
}
void GenerateNDigitNumber(int Keypad[][3], int n) {
   bool visited[4][3];
   memset(visited, false, sizeof(visited));
   for (int i = 0; i < 4; i++)
      for (int j = 0; j < 3; j++)
         if (Keypad[i][j] != -1)
            searchNumber(visited, Keypad, n, "", i, j);
}
int main() {
   int Keypad[4][3] ={
      { 1, 2, 3 },
      { 4, 5, 6 },
      { 7, 8, 9 },
      { -1, 0, -1 }
   };
   int n = 2;
   cout<<"All "<<n<<" digit number generated from keypad are :\n";
   GenerateNDigitNumber(Keypad, n);
   return 0;
}
出力
All 2 digit number generated from keypad are −
12 14 23 25 21 36 32 45 47 41 56 58 54 52 69 65 63 78 74 89 80 87 85 98 96 08

  1. すべてのサイクルをC++の無向グラフに出力します

    この問題では、無向グラフが与えられ、グラフに形成されるすべてのサイクルを印刷する必要があります。 無向グラフ 互いに接続されたグラフです。一方向グラフのすべてのエッジは双方向です。無向ネットワークとも呼ばれます。 サイクル グラフのデータ構造は、すべての頂点がサイクルを形成するグラフです。 問題をよりよく理解するための例を見てみましょう- グラフ- 出力- Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 このために、グラフのいくつかのプロパティを利用します。グラフ彩色法を使用して、閉路グラフで発生するすべての頂点に色を付ける必要があります。また、頂点

  2. 特定のソースから宛先までのすべてのパスをC++で出力します

    この問題では、有向グラフが与えられ、グラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう ソース=K宛先=P 出力: K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 この問題を解決するために、深さ優先探索を使用してグラフをトラバースします。