Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาจำนวนวิธีในการสำรวจต้นไม้ N-ary โดยใช้ C++


ให้ต้นไม้ N-ary และเราถูกมอบหมายให้ค้นหาจำนวนวิธีที่จะข้ามต้นไม้นี้ ตัวอย่างเช่น −

ค้นหาจำนวนวิธีในการสำรวจต้นไม้ N-ary โดยใช้ C++

สำหรับแผนภูมิด้านบน ผลลัพธ์ของเราคือ 192

สำหรับปัญหานี้ เราต้องมีความรู้เกี่ยวกับ combinatorics บ้าง ในปัญหานี้ เราเพียงแค่ต้องตรวจสอบชุดค่าผสมที่เป็นไปได้ทั้งหมดสำหรับทุกเส้นทาง และนั่นจะให้คำตอบแก่เรา

แนวทางในการหาแนวทางแก้ไข

ในแนวทางนี้ เราเพียงแค่ต้องทำการข้ามผ่านลำดับระดับ และตรวจสอบจำนวนลูกที่แต่ละโหนดมี จากนั้นเพียงคูณแฟคทอเรียลกับคำตอบ

ตัวอย่าง

รหัส C++ สำหรับแนวทางข้างต้น

#include<bits/stdc++.h>
using namespace std;
struct Node{ // structure of our node
    char key;
    vector<Node *> child;
};
Node *createNode(int key){ // function to initialize a new node
    Node *temp = new Node;
    temp->key = key;
    return temp;
}
long long fact(int n){
    if(n <= 1)
        return 1;
    return n * fact(n-1);
}
int main(){
    Node *root = createNode('A');
    (root->child).push_back(createNode('B'));
    (root->child).push_back(createNode('F'));
    (root->child).push_back(createNode('D'));
    (root->child).push_back(createNode('E'));
    (root->child[2]->child).push_back(createNode('K'));
    (root->child[1]->child).push_back(createNode('J'));
    (root->child[3]->child).push_back(createNode('G'));
    (root->child[0]->child).push_back(createNode('C'));
    (root->child[2]->child).push_back(createNode('H'));
    (root->child[1]->child).push_back(createNode('I'));
    (root->child[2]->child[0]->child).push_back(createNode('N'));
    (root->child[2]->child[0]->child).push_back(createNode('M'));
    (root->child[1]->child[1]->child).push_back(createNode('L'));
    queue<Node*> q;
    q.push(root);
    long long ans = 1;
    while(!q.empty()){
        auto z = q.front();
        q.pop();
        ans *= fact(z -> child.size());
        cout << z->child.size() << " ";
        for(auto x : z -> child)
           q.push(x);
   }
   cout << ans << "\n";
   return 0;
}

ผลลัพธ์

4 1 2 2 1 0 0 1 2 0 0 0 0 0 192

คำอธิบายของโค้ดด้านบน

ในแนวทางนี้ เราใช้ BFS(Breadth-First Search) หรือการข้ามผ่านลำดับระดับ และตรวจสอบจำนวนชายน์ที่แต่ละโหนดมี จากนั้นคูณแฟกทอเรียลของจำนวนนั้นกับคำตอบของเรา

บทสรุป

บทช่วยสอนนี้พบหลายวิธีในการสำรวจ N-ary tree combinatorics และโดยการใช้ BFS นอกจากนี้เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางทั้งหมดที่เราแก้ไข

เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์