मान लीजिए हमारे पास एक अंक है, अब यदि हम उस अंक को 180 डिग्री घुमाकर नए अंक बनाते हैं। जब 0, 1, 6, 8, 9 को 180 डिग्री घुमाया जाता है, तो वे क्रमशः 0, 1, 9, 8, 6 हो जाते हैं। लेकिन जब 2, 3, 4, 5 और 7 को 180 डिग्री घुमाया जाता है, तो वे अमान्य हो जाते हैं।
भ्रमित करने वाली संख्या एक ऐसी संख्या है जिसे 180 डिग्री घुमाने पर एक नई संख्या बन जाती है। इसलिए, यदि हमारे पास एक धनात्मक पूर्णांक N है, तो हमें 1 और N के बीच भ्रमित करने वाली संख्याओं की संख्या ज्ञात करनी होगी।
तो, अगर इनपुट 20 की तरह है, तो आउटपुट 6 होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक मानचित्र मानचित्रण परिभाषित करें
-
मान्य सरणी परिभाषित करें
-
एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें संख्या, घुमाने, अंक, एन,
-
अगर घुमाना संख्या के बराबर नहीं है, तो -
-
(रिटर्न 1 से बढ़ाएं)
-
-
इनिशियलाइज़ करने के लिए i:=0, जब i <वैलिड साइज़, अपडेट (i को 1 से बढ़ाएँ), −
करें-
खुदाई:=मान्य [i]
-
अगर संख्या * 10 + डिग> एन, तो
-
लूप से बाहर आएं
-
-
हल करें (संख्या * 10 + डिग, एक नक्शा परिभाषित करें, अंक * 10, एन)
-
-
मुख्य विधि से निम्न कार्य करें -
-
रिट:=0
-
मान्य :={ 0, 1, 6, 8, 9 }
-
मैपिंग [0] :=0
-
मैपिंग[1] :=1
-
मैपिंग[6] :=9
-
मैपिंग[9] :=6
-
मानचित्रण[8] :=8
-
हल(1, 1, 10, एन)
-
हल करें(6, 9, 10, एन)
-
हल करें(9, 6, 10, एन)
-
हल (8, 8, 10, एन)
-
वापसी रिट
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int ret; map <int, int> mapping; vector <int> valid; void solve(lli num, lli rotate, lli digit, lli N){ if (rotate != num) { ret++; } for (int i = 0; i < valid.size(); i++) { int dig = valid[i]; if (num * 10 + dig > N) { break; } solve(num * 10 + dig, mapping[dig] * digit + rotate, digit * 10, N); } } int confusingNumberII(int N) { ret = 0; valid = { 0, 1, 6, 8, 9 }; mapping[0] = 0; mapping[1] = 1; mapping[6] = 9; mapping[9] = 6; mapping[8] = 8; solve(1, 1, 10, N); solve(6, 9, 10, N); solve(9, 6, 10, N); solve(8, 8, 10, N); return ret; } }; main(){ Solution ob; cout << (ob.confusingNumberII(20)); }
इनपुट
20
आउटपुट
6