PAT 1004

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

看到这个题目,马上就想到了广搜。但是需要单独开一个数组,用来区分每个点属于哪一个层,同时记录每个层叶节点个数。

下面是 bfs的:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<string.h>
using namespace std ;

int level[100];//一开始不知道所在的层数,因此需要level用来记录区分
int Count[100];//记录每层的个数
vector<int> Link[100] ;
int maxlevel = -1 ;
void bfs(){
    queue<int> que ;
    que.push(1);
    level[1] = 1 ;
    while(!que.empty())
    {
        int index = que.front();
        que.pop();
        maxlevel = max(maxlevel,level[index]);
        if(Link[index].size()==0)
        {
            Count[level[index]] ++;
        }else {
            for(int i = 0 ; i < Link[index].size(); i ++)
            {
                level[Link[index][i]] = level[index]+1;
                que.push(Link[index][i]);
            }
        }

    }
}
int main(){
    int n , m , node, num , to;
    for(int i = 0 ; i < 100 ; i ++)
    {
        Link[i].clear();
    }
    memset(Count,0,sizeof(Count));
    cin >> n >> m ;
    maxlevel =-1 ;
    for(int i = 0 ; i < m ; i ++)
    {
        cin >> node >> num;
        for(int i = 0 ; i < num ; i ++)
        {
            cin >> to ;
            Link[node].push_back(to);
        }
    }
    bfs();
    printf("%d",Count[1]);
    for(int i = 2 ; i <=maxlevel ; i ++ )
    {
        printf(" %d",Count[i]);
    }
    printf("\n");
    return 0 ;

}

下面是 dfs的,在dfs里直接记录一个depth,就可以记录层数。也很简单。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

vector<int> v[100];
int book[100];
int maxDepth=-1; 

void dfs(int index,int depth){
    // 此时第index结点已经没有子结点了,则表明是叶子结点 
    if(v[index].size()==0){
        // 统计该叶子结点 
        book[depth]++;
        // 更新最大层次 
        maxDepth = max(maxDepth,depth);
        return ;
    }
    // 递归调用 
    for(int i=0;i<v[index].size();i++){
        dfs(v[index].at(i),depth+1);
    }
} 
int main(){
    int N,M;
    int node,K;
    while(cin>>N>>M){
        for(int i=0;i<M;i++){
            cin>>node>>K;
            for(int j=0;j<K;j++){
                int temp;
                cin>>temp;
                v[node].push_back(temp);
            }
        }

        // 从第一个结点开始,第零层 
        dfs(1,0);

        cout<<book[0];
        for(int i=1;i<=maxDepth;i++){
            cout<<" "<<book[i];
        } 
    }
    return 0;
}

 

### 关于C语言PAT乙级1004题的解法与解析 对于PAT乙级1004题,题目描述涉及处理学生的信息记录。具体来说,程序需要接收一系列的学生数据,每条数据包括学生的姓名、学号以及成绩,并最终按照特定的要求输出这些信息。 #### 题目结构分析 根据给出的内容,在该类问题中,输入的第一行为正整数\(n\)表示后续会有\(n\)组学生信息待录入;而接下来的每一行则对应一位学生具体的个人信息——依次为姓名、学号和成绩[^5]。值得注意的是,这里的姓名和学号长度均不会超过十个字符,而且所有学生的成绩都是独一无二的。 #### 编程实现要点 为了高效完成此类任务,可以考虑如下几个方面: - **存储方式的选择**:由于涉及到对学生信息的操作(如查询最高分最低分的同学),因此推荐使用数组或者链表来保存每位同学的数据。 - **排序逻辑的设计**:当面对求取最值的需求时,可以直接遍历整个列表找到最大最小值对应的索引位置,也可以先对原始数据按一定规则排序后再选取首位元素作为目标对象。 - **格式化输出控制**:最后一步是要严格按照题目规定的格式打印结果,注意各字段间的间隔符及换行等问题。 下面是一个简单的代码框架用于解决这个问题: ```c #include <stdio.h> #include <string.h> typedef struct { char name[11]; char id[11]; int score; } Student; int main() { int n, i; scanf("%d", &n); Student students[n]; for(i = 0; i < n; ++i){ scanf("%s %s %d", students[i].name, students[i].id, &(students[i].score)); } // 找到分数最高的学生 int maxIndex = 0; for(i = 1; i < n; ++i){ if(students[maxIndex].score < students[i].score) maxIndex = i; } // 找到分数最低的学生 int minIndex = 0; for(i = 1; i < n; ++i){ if(students[minIndex].score > students[i].score) minIndex = i; } printf("%s %s\n%s %s\n", students[maxIndex].name, students[maxIndex].id, students[minIndex].name, students[minIndex].id); return 0; } ``` 上述代码实现了基本的功能需求,即读入多名学生的资料并找出其中得分最高者与最低者的相关信息加以展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值