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

C++ में टेक्स्ट जस्टिफिकेशन


मान लीजिए कि हमारे पास शब्दों की एक सरणी और एक चौड़ाई maxWidth है, हमें टेक्स्ट को इस तरह से प्रारूपित करना होगा कि प्रत्येक पंक्ति में वर्णों की अधिकतम संख्या हो और पूरी तरह से उचित हो। हमें अपने शब्दों को लालची दृष्टिकोण से बांधना चाहिए; अर्थात्, प्रत्येक पंक्ति में जितने शब्द हम कर सकते हैं उतने शब्दों को पैक करें। जब आवश्यक हो तो हम अतिरिक्त रिक्त स्थान ' ' पैड करेंगे ताकि प्रत्येक पंक्ति में बिल्कुल अधिकतम विड्थ वर्ण हों।

यहां शब्दों के बीच अतिरिक्त रिक्त स्थान को यथासंभव समान रूप से वितरित किया जाना चाहिए। यदि एक पंक्ति पर रिक्त स्थान की संख्या शब्दों के बीच समान रूप से विभाजित नहीं होती है, तो बाईं ओर के खाली स्लॉट को दाईं ओर के स्लॉट की तुलना में अधिक स्थान दिए जाएंगे। पाठ की अंतिम पंक्ति के लिए, इसे उचित छोड़ दिया जाना चाहिए और शब्दों के बीच कोई अतिरिक्त स्थान नहीं डाला जाना चाहिए।

तो अगर इनपुट पसंद है

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

  • परिणाम नामक एक सरणी बनाएं

  • मैं के लिए 0 से लेकर ए के आकार तक, i द्वारा j को अपडेट करें

    • चौड़ाई :=0

    • j के लिए श्रेणी i से a के आकार और चौड़ाई + आकार a[j] + j – i <=b,

      के लिए
      • चौड़ाई :=चौड़ाई + आकार a[j]

    • स्पेस :=1, अतिरिक्त :=0

    • अगर j – 1 !=1 और j !=a का आकार, तो

      • अंतरिक्ष:=(बी - चौड़ाई) / जे - मैं - 1

      • अतिरिक्त:=(बी - चौड़ाई) मॉड (जे - आई - 1)

    • पंक्ति :=a[i]

    • k के लिए i + 1 से j की श्रेणी में

      • पंक्ति के साथ रिक्त-रिक्त स्थान की संख्या को संयोजित करें

      • यदि अतिरिक्त> 0 है, तो स्थान को लाइन से जोड़ दें

      • 1 द्वारा अतिरिक्त घटाएं

      • लाइन :=a[k] को लाइन से जोड़ना

    • x :=रेखा का आकार

    • लाइन:=लाइन के साथ रिक्त स्थान की संख्या (बी - एक्स) को संयोजित करें

    • परिणाम में लाइन डालें

  • रिटर्न रेस

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
void print_vector(vector<vector<auto>> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<string> fullJustify(vector<string> &a, int b) {
      vector <string> result;
      int i, j;
      for(i = 0; i < a.size(); i = j){
         int width = 0;
         for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){
            width += a[j].size();
         }
         int space = 1;
         int extra = 0;
         if(j - i != 1 && j != a.size()){
            space = (b - width) / (j - i - 1);
            extra = (b - width) % (j - i - 1);
         }
         string line(a[i]);
         for(int k = i + 1; k < j; k++){
            line += string(space, ' ');
            if(extra-- > 0){
               line += " ";
            }
            line += a[k];
         }
         int x = line.size();
         line += string(b - x, ' ');
         result.push_back(line);
      }
      return result;
   }
};
main(){
   vector<string> v = {"I", "love", "coding.", "here", "we", "will", "write", "some", "program"};
   Solution ob;
   print_vector(ob.fullJustify(v, 16));
}

इनपुट

["I", "love", "coding.", "here", "we", "will", "write", "some", "program"]
16

आउटपुट

[I love coding.,
here we will,
write some,
program ,
]

  1. C++ में एक लाइन के मध्य-बिंदु को खोजने का प्रोग्राम

    इस समस्या में, हमें दो बिंदु A और B दिए गए हैं, जो एक रेखा के आरंभ और अंत बिंदु हैं। हमारा काम C++ में एक लाइन के मध्य-बिंदु को खोजने के लिए एक प्रोग्राम बनाना है। समस्या का विवरण - यहाँ, हमारे पास एक रेखा है जिसमें शुरुआती और अंत बिंदु A(x1, y1) और B(x2, y2) हैं। और हमें रेखा के मध्य-बिंदु को खोजन

  1. सी ++ में एक लाइन पर मैक्स पॉइंट्स

    मान लीजिए कि हमारे पास 2D प्लेन है। हमें एक ही सीधी रेखा पर रहने वाले बिंदुओं की अधिकतम संख्या ज्ञात करनी है। तो अगर अंक इस तरह हैं - फिर 4 अंक होते हैं इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - n :=अंकों की संख्या, यदि n <3 है, तो n लौटाएं उत्तर :=2 मैं के लिए 1 से n - 1 की सीमा

  1. जाँच करें कि कोई रेखा C++ में वृत्त को स्पर्श करती है या प्रतिच्छेद करती है

    मान लीजिए हमारे पास एक वृत्त और दूसरी सीधी रेखा है। हमारा कार्य यह पता लगाना है कि रेखा वृत्त को स्पर्श करती है या उसे काटती है, अन्यथा वह बाहर से होकर गुजरती है। तो नीचे की तरह तीन अलग-अलग मामले हैं - यहां हम इसे निम्नलिखित चरणों द्वारा हल करेंगे। ये नीचे की तरह हैं - केंद्र के बीच लंबवत P ढूंढ