PAT刷题记录
Counting Leaves (30) 甲级
出现了一些新的知识点
难点在于存储为所有的点分层,而在测试样本中,有一些是打散顺序输入的,即并不是按照原有的层次遍历,所以无法直接按照父节点来分层,因为按照for循环来说,是按照由小到大进行遍历的,但是从输入测试案列来说,并不是父节点一定大于其孩子节点,(所以会出现遍历到了孩子节点,但其父节点还没有求出来层次)所以只能人为的将其转换为层次遍历,加入visit标志。
参考了网上一些答案,发现了一些错误,改进后如下:
#include "stdio.h"
#include "string.h"
#include "iostream"
using namespace std;
int main()
{
struct node {
int parent=0;
bool child = false;
int visit = 0;
int level=0;
}a[105];
int m, n;
int maxlevel = 0;
int level = 1;
int par, k, chil;
scanf_s("%d %d", &m, &n);
for (int i = 0; i < n; i++)
{
scanf_s("%d %d", &par, &k);
a[par].child = true;
for (int j = 0; j < k; j++)
{
scanf_s("%d ", &chil);
a[chil].parent = par;
}
}
a[1].level = 1;
a[1].visit = 1;
while (1)
{
int flag = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
{
if (a[j].parent == i&&a[i].visit==1)
{
if (a[j].visit == 0)
{
a[j].level = a[i].level + 1;
a[j].visit = 1;
flag++;
}
//printf("%d ", a[j].parent);
}
if (a[j].level > maxlevel)
maxlevel = a[j].level;
}
if (flag == 0)
break;
}
//printf("%d", maxlevel);
while (level <= maxlevel)
{
int count = 0;
int num = 0;
for (int i = 1; i <= m; i++)
{
if (a[i].level == level)
{
//printf("%d ", i);
count++;
if (a[i].child == false)
num++;
}
}
if (count == 0)
break;
level++;
//printf("%d \n",level);
printf("%d ", num);
}
}