Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में दो अंगुलियों का उपयोग करके शब्द टाइप करने के लिए न्यूनतम दूरी

मान लीजिए कि हमारे पास नीचे की तरह एक कीबोर्ड लेआउट है -

<टीडी>
<टीडी>
<टीडी>
<टीडी>
A बी सी डी एफ
जी एच मैं जे कश्मीर एल
एम एन पी प्रश्न आर
एस टी यू वी डब्ल्यू X
वाई Z

जहां प्रत्येक अंग्रेजी अपरकेस अक्षर कुछ निर्देशांक पर स्थित है, उदाहरण के तौर पर, अक्षर ए (0,0) पर रखा गया है, अक्षर बी (0,1) पर रखा गया है, अक्षर पी (2,3) पर रखा गया है और अक्षर Z को (4,1) पर रखा गया है। अब यदि हमारे पास कोई शब्द है, तो हमें केवल दो अंगुलियों का उपयोग करके ऐसी स्ट्रिंग टाइप करने के लिए न्यूनतम कुल दूरी ज्ञात करनी होगी। दो स्थानों (x1,y1) और (x2,y2) के बीच की दूरी है |x1 - x2| + |y1 - y2|। और हम कीबोर्ड पर किसी भी स्थिति से शुरू कर सकते हैं।

इसलिए, यदि इनपुट "हैप्पी" की तरह है, तो आउटपुट 6 होगा, जैसा कि एच से शुरू होता है, इसलिए लागत 0 है, फिर ए, इसलिए एच से ए तक की लागत 2 है, फिर पी, इसलिए लागत 0 है, फिर से P, लागत 0 है, और अंत में Y, इसलिए P से Y तक की लागत 4 है, इसलिए कुल लागत 6 + 4 =10 है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक मैप मेमो परिभाषित करें

  • फ़ंक्शन getHash() को परिभाषित करें, इसमें a, b, c, d, e,

    . लगेगा
  • अस्थायी:=0

  • जबकि a गैर-शून्य है, करें -

    • अस्थायी:=अस्थायी * 10 + एक मॉड 10, ए:=ए / 10

  • जबकि b गैर-शून्य है, करें −

    • अस्थायी:=अस्थायी * 10 + बी मॉड 10, बी:=बी / 10

  • जबकि c गैर-शून्य है, करें −

    • अस्थायी:=अस्थायी * 10 + डी मॉड 10, डी:=डी / 10

  • जबकि ई गैर-शून्य है, करें

    • अस्थायी:=अस्थायी * 10 + ई मॉड 10, ई:=ई / 10

  • वापसी अस्थायी

  • एक विधि को परिभाषित करें getXY(), इसमें c

    लगेगा
    • एक जोड़ी रिट परिभाषित करें

    • a :=c - 'A' का ASCII

    • ret.second :=एक मॉड 6

    • ret.first :=a / 6

    • वापसी रिट

  • फ़ंक्शन getDist() को परिभाषित करें, इसमें a, b, c, d,

    . लगेगा
  • यदि a, -1 के समान है और b, -1 के समान है, तो -

    • वापसी 0

  • वापसी |(बी - डी) + |ए - सी||

  • एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें x1, y1, x2, y2, शब्द, idx,

    लगेगा।
  • यदि idx शब्द के आकार के समान है, तो -

    • वापसी 0

  • राज्य:=getHash(x1 + 2, y1 + 2, x2 + 2, y2 + 2, idx + 2)

  • अगर राज्य मेमो में है तो -

    • वापसी ज्ञापन [राज्य]

  • एक जोड़ी अस्थायी परिभाषित करें:=getXY(word[idx])

  • उत्तर:=0

  • A:=getDist(x1, y1, temp.first, temp.second +solve(temp.first, temp.second, x2, y2, word, idx + 1))

  • बी:=getDist(x2, y2, temp.first, temp.second +solve(x1, y1, temp.first, temp.second, word, idx + 1))

  • उत्तर:=न्यूनतम ए और बी

  • वापसी ज्ञापन [राज्य] =उत्तर

  • मुख्य विधि से निम्न कार्य करें -

  • वापसी हल (-1, -1, -1, -1, शब्द, 0)

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   map<int, int> memo;
   int getHash(int a, int b, int c, int d, int e){
      int temp = 0;
      while (a) {
         temp = temp * 10 + a % 10;
         a /= 10;
      }
      while (b) {
         temp = temp * 10 + b % 10;
         b /= 10;
      }
      while (c) {
         temp = temp * 10 + c % 10;
         c /= 10;
      }
      while (d) {
         temp = temp * 10 + d % 10;
         d /= 10;
      }
      while (e) {
         temp = temp * 10 + e % 10;
         e /= 10;
      }
      return temp;
   }  
   pair<int, int> getXY(char c){
      pair<int, int> ret;
      int a = c - 'A';
      ret.second = a % 6;
      ret.first = a / 6;
      return ret;
   }
   int getDist(int a, int b, int c, int d){
      if (a == -1 && b == -1)
      return 0;
      return abs(b - d) + abs(a - c);
   }
   int solve(int x1, int y1, int x2, int y2, string word, int idx){
      if (idx == word.size())
      return 0;
      int state = getHash(x1 + 2, y1 + 2, x2 + 2, y2 + 2, idx + 2);
      if (memo.find(state) != memo.end())
      return memo[state];
      pair<int, int> temp = getXY(word[idx]);
      int ans = 0;
      int A = getDist(x1, y1, temp.first, temp.second) +
      solve(temp.first, temp.second, x2, y2, word, idx + 1);
      int B = getDist(x2, y2, temp.first, temp.second) + solve(x1,
      y1, temp.first, temp.second, word, idx + 1);
      ans = min(A, B);
      return memo[state] = ans;
   }
   int minimumDistance(string word){
      memo.clear();
      return solve(-1, -1, -1, -1, word, 0);
   }
};
main(){
   Solution ob;;
   cout << (ob.minimumDistance("HELLO"));
}

इनपुट

"HELLO"

आउटपुट

4

  1. पता लगाएं कि क्या दो आयत C++ का उपयोग करके ओवरलैप करते हैं।

    हम जानते हैं कि एक आयत को दो निर्देशांकों, ऊपरी बाएँ कोने और निचले दाएँ कोने का उपयोग करके दर्शाया जा सकता है। मान लीजिए कि दो आयत हैं, हमें यह जांचना है कि ये दोनों अतिव्यापन करते हैं या नहीं। चार निर्देशांक बिंदु (l1, r1) और (l2, r2) हैं। l1 पहले आयत का ऊपरी-बाएं कोना है r1 पहले आयत का निचला दाया

  1. C++ में ++ ऑपरेटर का उपयोग करके दो नंबर जोड़ें।

    प्रोग्रामिंग में, ++ ऑपरेटर इंक्रीमेंट ऑपरेटर है जो ऑपरेंड के मूल्य को 1 से बढ़ाता है। हम इस ऑपरेटर का उपयोग करके संख्या a, b संख्या में 1 जोड़कर दो नंबर जोड़ सकते हैं। उदाहरण, Input: a = 31 , b = 4 Output: 35 स्पष्टीकरण − 1 से 31 को चार बार जोड़ने पर 31 +1+1+1+1 =35 तक का योग बनता है। एल्गोरिदम I

  1. C++ में न्यूनतम तुलनाओं का उपयोग करते हुए तीन में से मध्य

    इस भाग में, हम देखेंगे कि तीन दिए गए मानों की तुलना करके उनके मध्य का पता कैसे लगाया जाए। तो अगर तीन नंबर दिए गए हैं जैसे (10, 30, 20), तो यह 20 मिलेगा क्योंकि यह मध्य तत्व है। आइए पहले एल्गोरिथम देखें, फिर हम उस एल्गोरिथम को C++ कोड में लागू करेंगे। एल्गोरिदम middle_of_three(a, b, c): Input: Three