Memandangkan pokok N-ary, tugas kita adalah untuk mencari jumlah cara untuk melintasi pokok itu, cth.
Untuk masalah ini, kita memerlukan sedikit pengetahuan tentang kombinatorik. Sekarang dalam masalah ini kita hanya perlu menyemak semua kemungkinan kombinasi setiap laluan dan ini akan memberi kita jawapannya.
Kaedah untuk mencari penyelesaianDalam kaedah ini, kita hanya perlu melakukan traversal tahap, semak bilangan anak yang ada pada setiap nod, dan kemudian darabkan secara berfaktor dengan jawapan. ContohC++ kod kaedah di atas
#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
Atas ialah kandungan terperinci Cari bilangan cara untuk melintasi pokok N-ary menggunakan C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!