X ን ወደ Y ለመለወጥ አነስተኛ ክዋኔዎች  


የችግር ደረጃ መካከለኛ
ውስጥ በተደጋጋሚ ተጠየቀ አማዞን ፋርስት አፍቃሪዎች አራት ኪይትስ ጂፒ ሞርጋን ሚንትራ ሳምሰንግ Spotify አራት ማዕዘን
ስፌት የመጀመሪያ ፍለጋ ግራፍ

የችግሩ መግለጫ  

ችግሩ “X ን ወደ Y ለመለወጥ አነስተኛ ክወናዎች” የሚለው ሁለት ቁጥሮች X እና Y እንደተሰጠዎት ያሳያል ፣ የሚከተሉትን ክዋኔዎች በመጠቀም ኤክስ ወደ ዩ መለወጥ አስፈላጊ ነው ፡፡

የመነሻ ቁጥር X ነው ፡፡ የሚከተሉትን ክዋኔዎች በኤክስ ላይ እና እንደ መካከለኛ ውጤት በሚመነጩ ቁጥሮች ላይ ሊከናወን ይችላል ፡፡

  1. ቁጥሩን በ 2 ማባዛት ፡፡
  2. ቁጥሩን በ 1 ቀንስ።

ከዚህ በላይ የተጠቀሱትን ክዋኔዎች በመጠቀም X ን ወደ Y ለመለወጥ የሚያስፈልጉትን አነስተኛ የእርምጃዎች ቁጥር ያግኙ ፡፡

ገደቦች 0 <X, Y <1000

ለምሳሌ  

X = 3, Y = 11
3

ማስረጃ: 3 * 2 = 6, 6 * 2 = 12, 12-1 = 11 3 ደረጃዎች

X = 2, Y = 10
5

ማብራሪያ: 2 * 2 = 4, 4-1 = 3, 3 * 2 = 6, 6-1 = 5, 5 * 2 = 10 -> 5 ደረጃዎች

ቀረበ  

እኛ ተግባራዊ እናደርጋለን BFS የተመሠረተ አልጎሪዝም ከዚያ እኛ 2 ክዋኔዎችን ማከናወን እንችላለን ወይ በ 2 ተባዝተናል ወይም በመቀነስ 1. በዚህ መንገድ የመነሻ ቁጥር X ን በመጠቀም እና የተሰጡትን ሁለት ክዋኔዎች በማከናወን ሊገኙ የሚችሉትን ቁጥሮች ሁሉ መድረስ እንችላለን ፡፡ ማንኛውም የመነጨ ቁጥር ከግብዓት ቁጥር Y ጋር እኩል ከሆነ ተገኝቷል። ስለዚህ ቁጥር Y ን ለማመንጨት የተወሰዱትን እርምጃዎች ቁጥር በቀላሉ እንመልሳለን። ቁጥሮች በሚፈጠሩበት ጊዜ የሚከተሉትን ነጥቦች በአእምሯችን መያዙ አስፈላጊ ነው።

  1. የተፈጠረው ቁጥር ውስንነቶችን የማያሟላ ከሆነ ወደ ቢኤፍኤስኤስ ወረፋ ለማስገባት ቁጥሩን ችላ እንለዋለን ፡፡
  2. አሁን የተፈጠረው ቁጥር ከዚህ በፊት የተፈጠረ ከሆነ ፡፡ ቁጥሩን በ BFS ወረፋ ላይ ባለመጨመር በቀላሉ ቁጥሩን ችላ እንላለን። እስካሁን ድረስ የሚመነጩ ቁጥሮችን ለመከታተል የሃሽ ስብስብ ጥቅም ላይ ይውላል።
  3. የክዋኔዎችን ብዛት እንከታተላለን (በተሰየመው ተለዋዋጭ ውስጥ) ደረጃ) አስፈላጊ ክዋኔዎችን በማከናወን ቁጥር X ከመነሻ ቁጥር ለማመንጨት የተከናወነ ፡፡
ተመልከት
በአንድ ዛፍ ውስጥ ሁለት አንጓዎች በተመሳሳይ መንገድ ላይ መሆናቸውን ያረጋግጡ

X ን ወደ Y ለመለወጥ አነስተኛ ክዋኔዎችን ለማግኘት ስልተ ቀመር  

  1. ፍጠር ተራ ለቢኤፍ.ኤፍኤስ ማቋረጥ እና የመነሻውን ቁጥር X ያስገቡ እና ወደ ወረፋው ደረጃ ነው ፡፡ X ን ወደ X ለመለወጥ የሚያስፈልጉት የሥራዎች ብዛት 0 ስለሆነ የመነሻ ቁጥር ደረጃ 0 ነው።
  2. ፍጠር ሃሽሴት እስካሁን የተፈጠሩ ቁጥሮችን የሚያከማች ፡፡
  3. ከዚያ የ BFS ማቋረጥ ይጀምሩ።
  4. የመስቀለኛ ክፍል እሴት ከግብዓት ቁጥር Y ጋር እኩል ከሆነ አንድ መስቀለኛ መንገድ ከወረፋው ላይ ብቅ ይበሉ እና የዚህ መስቀለኛ መንገድ የመመለሻ ደረጃ (አነስተኛ የሥራዎች ብዛት ከ X)።
  5. ሌላ ፣ ይህንን መስቀለኛ መንገድ ወደ ሃሽ ስብስባችን ውስጥ ይጨምሩ (እንደጎበኘ ምልክት ያድርጉበት)።
  6. አሁን ብቅ ያለውን የመስቀለኛ ክፍል እሴቱን በ 2 ያባዙ እና በስብስቡ ውስጥ ካለ ያረጋግጡ።
  7. እንደዚህ የመነጨው ቁጥር በስብስቡ ውስጥ ከሌለ። ስለዚህ ቁጥሩን በደረጃው (ወረፋው) ያስገቡ (የዚህ መስቀለኛ መንገድ የመነጨ = የታየ (የወላጅ) መስቀለኛ መንገድ + 1))።
  8. ብቅ ያለውን የመስቀለኛ ክፍል እሴትን በ 1 ቀንሱ እና በስብስቡ ውስጥ ካለ ያረጋግጡ።
  9. እንደዚህ የመነጨው ቁጥር በስብስቡ ውስጥ ከሌለ። ስለዚህ ቁጥሩን በደረጃው (ወረፋው) ያስገቡ (የዚህ መስቀለኛ መንገድ የመነጨ = የታየ (የወላጅ) መስቀለኛ መንገድ + 1))።
  10. በ ውስጥ የመመለሻ ሁኔታ እስክንገናኝ ድረስ ደረጃዎቹን ከ3-9 በተከታታይ ይድገሙ ደረጃ -4.

አልጎሪዝም ከዚህ በታች ቀርቧል

X ን ወደ Y ለመለወጥ አነስተኛ ክዋኔዎች

ኮድ  

X ን ወደ Y ለመለወጥ አነስተኛ ክዋኔዎችን ለማግኘት የ C ++ ኮድ

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

/* class definition to treat 
numbers generated as nodes */
class Node
{
    public:
    int num;
    int level;
    
    Node(int num,int level)
    {
        this->num = num;
        this->level = level;
    }
};

/* function to find minimum number of 
operations required to convert x into y */
int minOperation(int x,int y)
{
    queue<Node*> q;
    unordered_set <int> us;
    
    Node *node = new Node(x,0);
    q.push(node);
    
    while(!q.empty())
    {
        Node *top = q.front();
        q.pop();
        
        if(top->num == y)
        return top->level;
        
        us.insert(top->num);
        
        /* Multiplication Operation */
        if(us.find(2*top->num) == us.end())
        {
            Node *temp = new Node(2*top->num,top->level+1);
            q.push(temp);
        }
        
        /* Subtraction Operation */
        if(us.find(top->num-1) == us.end() && top->num-1 > 0)
        {
            Node *temp = new Node(top->num-1,top->level+1);
            q.push(temp);
        }
    }
}
/* Main function */
int main()
{
    int x = 2,y = 10;
    cout<<minOperation(x,y)<<endl;
    
    return 0;
}
5

X ን ወደ Y ለመለወጥ አነስተኛ ክዋኔዎችን ለማግኘት የጃቫ ኮድ

import java.util.*;
import java.io.*;

class TutorialCup 
{
    /* class definition to treat 
    numbers generated as nodes */
    static class Node
    {
        int num;
        int level;
        
        Node(int num,int level)
        {
            this.num = num;
            this.level = level;
        }
    }
    
    /* function to find minimum number of 
    operations required to convert x into y */
    static int minOperation(int x,int y)
    {
        Queue <Node> q = new LinkedList<>();
        HashSet <Integer> hs = new HashSet<Integer>();
        
        Node node = new Node(x,0);
        q.add(node);
        
        while(!q.isEmpty())
        {
            Node top = q.poll();
            
            if(top.num == y)
            return top.level;
            
            hs.add(top.num);
            
            /* Multiplication Operation */
            if(!hs.contains(2*top.num))
            {
                Node temp = new Node(2*top.num,top.level+1);
                q.add(temp);
            }
            
            /* Subtraction Operation */
            if(!hs.contains(top.num-1) && top.num-1 > 0)
            {
                Node temp = new Node(top.num-1,top.level+1);
                q.add(temp);
            }
        }
        
        return 0;
    }
    /* Main function */
  public static void main (String[] args) 
  {
      int x = 2,y = 10;
        System.out.println(minOperation(x,y));
  }
}
5

ውስብስብነት ትንተና  

የጊዜ ውስብስብነት

ከላይ የተጠቀሰውን አካሄድ በመጠቀም ቁጥር ለማግኘት ጊዜ ውስብስብነት ላይ አስተያየት መስጠት ከባድ ነው ፡፡ ግን አሁንም በጣም በከፋ የጊዜ ውስብስብነት ላይ አስተያየት መስጠት እንችላለን ፡፡ በጣም በከፋ ሁኔታ ውስጥ ምን ሊሆን ይችላል በግዳጅ ስር የሚገኙትን ሁሉንም ቁጥሮች እናልፋለን ፡፡ ሁሉንም ቁጥሮች እንኳን ማለፍ እንኳ የሚያስፈልገንን ቁጥር አናገኝም ፡፡ ስለዚህ የጊዜ ውስብስብነት ነው ኦ (ኤን)፣ በተሰጡት ገደቦች ውስጥ በተቻለ መጠን ትልቁ ኤን.

ተመልከት
በተመሳሳዩ እኩል እና ያልተለመዱ ንጥረ ነገሮች ንዑስ ቤራጮችን ይ Countጥሩ

የቦታ ውስብስብነት

ስለ ጠፈር ውስብስብነት እንዲሁ አስተያየት መስጠት ከባድ ነው ፡፡ ግን ከጊዜ ውስብስብነት ጋር ካደረግነው ጋር ተመሳሳይ ፡፡ ስለዚህ ለቦታ ውስብስብነት ተመሳሳይ ነው ፡፡ በጣም በከፋ ሁኔታ ውስጥ ሁሉንም ንጥረ ነገሮች ወደ ወረፋው ውስጥ እናገባቸዋለን። ይህ እንዲወስድ ስልተ ቀመር ያደርገዋል ኦ (ኤን) ቦታ ፣ N በተሰጠው ገደብ ውስጥ የሚቻለው ትልቁ ቁጥር ነው ፡፡