首页 > 其他分享 >菜鸟记录:c语言实现PAT甲级1004--Counting Leaves

菜鸟记录:c语言实现PAT甲级1004--Counting Leaves

时间:2023-04-17 15:25:39浏览次数:40  
标签:101 PAT int 菜鸟 ID 叶子 child Counting 节点

    好消息:与上题的Emergency是同样的方法。坏消息:又错了&&c++真的比c方便太多太多。

A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 0<N<100, the number of nodes in a tree, and M (<N), the number of non-leaf nodes. Then M lines follow, each in the format:

ID K ID[1] ID[2] ... ID[K]
 

where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 01.

The input ends with N being 0. That case must NOT be processed.

Output Specification:

For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.

The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output 0 1 in a line.

Sample Input:

2 1
01 1 02
 

Sample Output:

0 1

题目分析

    分析家族族谱,算出非叶子节点,就是非孩子数量。,所有的节点用两位数字表示,例如:01,02,06等,其中为了方便,令01为根节点。

    输入: N(100个以内的的节点) M(非叶子节点数)

       【接下的M行内】 ID(非叶子节点)K(所连的叶子 / 孩子节点个数)ID[0] ID[1]...ID[K](K个叶子节点)

    输出:(每层的叶子节点个数)中间用空格隔开————>注意,pat对输出有着固定且严格的格式,所以最后结果的第一个数字前是没有空格的。

    就是用广度优先或深度优先遍历每一层,同时标记每层叶子节点并记录,最后数组输出

个人想法

    其实一开始,我觉得很简单,既然只看叶子节点个数,那每次输入ID[0-K]时,我进行记录不就行了吗,每次输入ID都是不同的层级,最后得到的的不就是每层孩子数,所以我在写输入的时候加了一点点变量,最后输出。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 int ID[101];
 6 int book[101];//记录输出每层叶节点个数    
 7 int b;        //每层的叶节点数
 8 
 9 int main() {
10     int N, M;
11     scanf("%d%d", &N, &M);
12     int K;
13     int a = 1;
14     for (int i = 1; i <= N; i+=K+1) {
15         scanf("%d%d", &ID[i], &K);     
16         if( K != 0)
17         for (int j = i+1; j <= i+K; j++) {
18             scanf("%d", &ID[j]);
19             b++;    //没输入一次叶节点数就增加一个
20         }
21         book[a] = b;//记录
22         b = 0;//归零进行下次计算    
23         a++;//记录数组下标移动
24     }
25     printf("%d", book[0]);//输出第一层
26     for (int i = 1; i <= M; i++) {
27         printf(" %d", book[i]);//输出接下来的每层,并于上一个数字隔开
28 
29     }
30     return 0;
31 }            
View Code

    最后得分13分。。。意料之中,举例思考的时候都只考虑了二叉树,编写的过程中便觉的那如果一个节点有有多个非叶节点甚至没有叶节点应该怎么填写。回过头来再看这段,更是觉得搞笑,如果这样可行,那直接记录K就好了。于是尝试着写了第二种,先构建一颗完整的树,然后深度遍历。

    首先,变量的设置

1 int N, M;//同题目N,M
2 int K;
3 typedef struct NODE{
4     int nodes;//记录每个节点拥有的叶子节点数
5     int ID[101];    //记录各个叶子节点
6 };
7 struct NODE child[101];//树
8 int book[101];//保存、输出每层叶子节点数
9 int max;    //比较和更新每层的叶子节点数,因为左边的遍历完,右边的还要遍历并记录

    这里使用了结构体而不是简单的数组或者二维数组记录,是因为退出递归的条件需要知道此时节点后续有无别的节点。对比之前的深度遍历我们可以知道,在每次递归的结束条件语句中,会判断后续“无路可走”后才停止并return,1003中是

 if (curlen > mindis[curcity])return;   

  ,即如果所求的路径走这时变长就停止这条路。在此题则是你所谈的节点后面无节点就说明是叶子节点,那么就停止遍历,并记录数量。但是我开始在这使用二维数组,判定条件:

if(child[curnode]==0) return;

认为全局变量初始化为0,而这样判断说明此行均为0时就说明它是空的是叶子节点,但是实际运行出现了死循环,因为你在输入的for语句中都会因为默认给每一行赋值,导致你输入的值令每行都不是全为0(有点混乱)。而c++中用 child.[curnode]size()【child是vector型】判断长度,如果等于0 ,则进入叶子节点的计数。所以对c语言使用结构体记录每个节点的叶子节点数和叶子节点编号。

 1 void dfs(int curnode ,int curlevel);
 2 int main() {
 3     int a;
 4     scanf("%d%d", &N, &M);
 5     for (int i = 0; i < M; i++) {
 6         scanf("%d%d", &a, &K);
 7         child[a].node = K;//非叶节点ID,所有的叶子节点数
 8         for (int j = 0; j <K; j++) {
 9             scanf("%d", &child[a].ID[j]);  //叶子节点序号
10         }
11     }
12     dfs(1, 0);//从 1 开始是因为01为根节点,所有存放元素的是child[01]不是child[0]
13     printf("%d", book[0]);
14     for (int i = 1; i <= max; i++) {
15         printf(" %d", book[i]);
16 
17     }
18     return 0;
19 }
20 void dfs(int curnode, int curlevel) {
21     if (child[curnode].node == 0) {   //判断有无叶节点,无则进入此记录保存
22         if(max<curlevel)
23         max = curlevel;        //更新当前遍历所在的叶子节点层数
24         book[curlevel]++;        //没到该层,叶子节点数加 1 
25         return;
26     }
27     for (int i = 0; i < child[curnode].node; i++) {    //因为对该节点进行遍历,所以在它有的叶子节点数范围内循环
28         dfs(child[curnode].ID[i], curlevel + 1);    //把当前的某个叶子节点的数值带入下一个节点的索引,层级加1.
29     }
30  }

 


<-----------------------------------完整代码----------------------------------->

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 
 6 
 7 int N, M;
 8 int K;
 9 typedef struct NODE{
10     int node;
11     int ID[101];
12 };
13 struct NODE child[101];
14 int book[101];
15 int max;
16 
17 void dfs(int curnode ,int curlevel);
18 int main() {
19     int a;
20     scanf("%d%d", &N, &M);
21     for (int i = 0; i < M; i++) {
22         scanf("%d%d", &a, &K);
23         child[a].node = K;
24         for (int j = 0; j <K; j++) {
25             scanf("%d", &child[a].ID[j]);
26         }
27     }
28     dfs(1, 0);
29     printf("%d", book[0]);
30     for (int i = 1; i <= max; i++) {
31         printf(" %d", book[i]);
32 
33     }
34     return 0;
35 }
36 void dfs(int curnode, int curlevel) {
37     if (child[curnode].node == 0) {
38         if(max<curlevel)
39         max = curlevel;
40         book[curlevel]++;
41         return;
42     }
43     for (int i = 0; i < child[curnode].node; i++) {
44         dfs(child[curnode].ID[i], curlevel + 1);
45     }
46  }
View Code

 

总结

    其实掌握深度遍历总体大概的流程,结合题目改变判定条件写出总体的框架基本都能得分,然后调试以后进行修改就大差不差了。

标签:101,PAT,int,菜鸟,ID,叶子,child,Counting,节点
From: https://www.cnblogs.com/whf10000010/p/17325936.html

相关文章

  • 关于软件测试领域的 Happy Path
    在软件测试领域,happypath是指一组测试用例,其中每个测试用例都覆盖了一个顺畅运行的路径,即一组不需要任何异常处理的输入和操作,以及相应的预期输出和结果。通常,这些测试用例被设计为模拟最常见、最基本和最常用的用户行为和用例场景,以确保软件在正常操作条件下可以正确地运行和处......
  • CF1816F Xor Counting - dp - 分治 -
    题目链接:https://codeforces.com/contest/1816/problem/F题解:一道有趣的题。首先发现\(m=1\)和\(m\geq3\)时结论是平凡的。\(m=1\)时结论显然,下面讨论一下\(m\geq3\)时:首先可以构造\([x,(n-x)/2,(n-x)/2,\cdots]\),其中\(x\)和\(n\)同奇偶,显然此时异或值可以......
  • PAT Basic 1102. 教超冠军卷
    PATBasic1102.教超冠军卷1.题目描述:“教育超市”是拼题A系统的一个衍生产品,发布了各种试卷和练习供用户选购。在试卷列表中,系统不仅列出了每份试卷的单价,还显示了当前的购买人次。本题就请你根据这些信息找出教育超市所有试卷中的销量(即购买人次)冠军和销售额冠军。2.输......
  • PAT Basic 1101. B是A的多少倍
    PATBasic1101.B是A的多少倍1.题目描述:设一个数 \(A\) 的最低 \(D\) 位形成的数是 \(a_d\)。如果把 \(a_d\) 截下来移到 \(A\) 的最高位前面,就形成了一个新的数 \(B\)。\(B\) 是 \(A\) 的多少倍?例如将12345的最低2位45截下来放到123的前面,就得到45123,......
  • AS_Path Filter的应用方式
    AS_PathFilter的应用方式AS_Path过滤器只定义一个过滤工具,需要在某个地方调用这个过滤工具才会最终生效。在BGP中可以有两种方式调用AS_Path过滤器:通过peer命令直接调用AS_Path_Filter。通过route-policy调用AS_Path_Filter。应用方式一:通过peer命令直接调用as-path-filter#ipas......
  • PAT Basic 1100. 校庆
    PATBasic1100.校庆1.题目描述:2019年浙江大学将要庆祝成立122周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。2.输入格式:输入在第一行给出不超过\(10^5\)的正整数N,随后N行,每行给出......
  • git 遇到的CApath: none问题解决
    在适应git时,遇到了如下问题。fatal:unabletoaccess'https://github.com/brunosimon/folio-2019.git/':errorsettingcertificateverifylocations: CAfile:D:/明月下/Git/mingw64/ssl/certs/ca-bundle.crtCApath:none第一反应是查找这个文件是什么,在不在。首先这......
  • PAT Basic 1099. 性感素数
    PATBasic1099.性感素数1.题目描述:“性感素数”是指形如\((p,p+6)\)这样的一对素数。之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。(原文摘自http://mathworld.wolfram.com/SexyPrimes.html)现给定一个整数,请你判断其是否为一个性感素数。2.输入格......
  • centos7 PATH 环境变量设置
    https://blog.csdn.net/qq_39715000/article/details/1250231901、系统环境变量系统环境变量对全部的用户生效,设置系统环境变量有三种方法。1)在/etc/profile文件中设置。用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环......
  • os.path.dirname;os.path.abspath;os.walk方法详解
    os.path.dirname:os.path.dirname(path):用来获取文件的路径   os.path.dirname(__file__):用来获取当前py文件的上层目录例如:当前文件所处位置为:D:/AutoTestSys/script/AutoFunction/test1.pyprint(os.path.dirname(__file__))返回的结果为: D:/AutoTestSys/script/Aut......