1. 程式人生 > >1004 Counting Leaves (30 分)c++實現

1004 Counting Leaves (30 分)c++實現

題目

https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184

解題思路與程式碼實現

思路1:

構建一個結構體,包含三個元素,id,是否有孩子, 層級
構建一個數組維護樹結構
讀取元素以及其孩子,對其孩子id對應的陣列位置的level進行更新,為本節點+1
讀取完資料後, 按照level對陣列遍歷, 對!has_child的本level進行累加

遇到的問題:

  1. 如何將01這樣的兩位編號合適的轉化為int型別
    讀取一個char[3]的陣列用atoi(char*) 函式轉為int
    如果只是使用int值, 直接用int變數去接收cin的傳參,如果希望使用char和int, 則按照上面的方法

  2. 打亂ID的順序, 例如兒子在雙親前, 會導致level錯誤(此時雙親的level為0)
    測試點1,3相關

  3. 對ID不連續敏感,但題目並沒有保證ID的連續性(通過加used並沒有減少未通過項,證明不是連續敏感的問題)

可能的解決辦法: 先建樹再計層數

思路2:

1 3 測試點過不去, 問題最可能出現在2上,若給定順序不一樣
先將節點資訊存起來, 再從根開始向下找,這就是為什麼網上的一些程式碼是使用DFS或BFS的構建一個結構體, 儲存節點的子節點
從根節點按照DFS遍歷樹

/***********************************
	思路1 測試點1 3 過不去
************************************/
#include <iostream> #include <string> #include <vector> using namespace std; struct Node { bool has_child; int level; bool used; }; int main() { int N, M, tree_level = 0; cin >> N; if (N == 0) return 0; cin >> M; vector<Node> tree(N +
1); // tree[0] is abondon. for (int i = 0; i < tree.size(); i++) { tree[i].has_child = false; tree[i].used = false; } tree[1].level = 0; tree[1].used = 1; for (int i = 0; i < M; i++) { int k; int ID; cin >> ID >> k; int parent = ID; tree[parent].has_child = true; for (int j = 0; j < k; j++) { int temp; cin >> temp; tree[temp].level = tree[parent].level + 1; tree[temp].used =true; tree_level = tree[parent].level + 1; } } // brute force method. for (int i = 0; i <= tree_level; i++) { int cnt = 0; for (auto p = ++tree.begin(); p != tree.end(); p++) { if (p->level == i && p->used && !p->has_child) cnt++; } if (i != tree_level) cout << cnt << " "; else cout << cnt; } getchar(); getchar(); return 0; }
/*********************************
思路2 儲存所有資訊並通過DFS計數每層葉子節點
**********************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Node {
    vector<int> childs;
};

int layer_counter[100] = {0};
int maxlayer = 0;
void DFS(int index, int layer, Node* node) {
    maxlayer = max(layer, maxlayer); // update maxlayer
    if (node[index].childs.size() == 0) {
        layer_counter[layer]++;
        return ;
    }
    for (int i = 0; i < node[index].childs.size(); i++) {
        DFS(node[index].childs[i], layer + 1, node);
    }
        
}
int main(void)
{
    int M, N;
    cin >> N;
    if (!N) return 0;
    Node *node = new Node[N+1];
    cin >> M;
    // for(int i = 0; i< 100; i++)
    //     node[i].layer = 0;
    while(M--) {
        int id, k;
        cin >> id >> k;
        while (k--) {
            int child;
            cin >> child;
            node[id].childs.push_back(child);
        }
    }
    DFS(1, 0, node);
    for (int i = 0; i <= maxlayer; i++) {
        if (i != maxlayer)
            cout << layer_counter[i] << " ";
        else
            cout << layer_counter[i];
    }
    getchar();
    getchar();
    return 0;
}