文章目录

  • 第一题:《教父》家族关系维护
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例
    • 解题思路&C++题解
      • 算法1
      • 算法2
      • 算法3
      • 算法4
      • 算法5
      • 算法6
      • 算法7
  • 第二题:柯里昂家族树
    • 题目描述
    • 约定
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例
    • 解题思路&C++题解
      • 算法1
      • 算法2
      • 算法3

第一题:《教父》家族关系维护

题目描述

在《教父》中,有五个家族,分别是Corleone家族、Tattaglia家族、Cuneo家族、Stracci家族和Barzini家族。五个家族之间的关系是复杂的,它们之间可能存在敌对关系、盟友关系和中立关系。

你需要写一个程序来计算五个家族之间的关系。你需要输入五个家族之间的关系,然后输出五个家族之间的关系矩阵。

你需要自定义一个算法来计算五个家族之间的关系,算法的输入是五个家族之间的关系,输出是五个家族之间的关系矩阵。

算法的实现方式是你自己决定的,但你需要考虑这道题的时间复杂度和空间复杂度。

输入格式:

输入第一行包含五个整数,分别表示Corleone家族、Tattaglia家族、Cuneo家族、Stracci家族和Barzini家族之间的关系。整数的取值范围是-1、0、1,分别表示敌对关系、中立关系和盟友关系。

输入格式

输入第一行包含五个整数,分别表示Corleone家族、Tattaglia家族、Cuneo家族、Stracci家族和Barzini家族之间的关系。整数的取值范围是-1、0、1,分别表示敌对关系、中立关系和盟友关系。

输出格式

输出五行,每行五个整数,分别表示Corleone家族、Tattaglia家族、Cuneo家族、Stracci家族和Barzini家族之间的关系。整数的取值范围是-1、0、1,分别表示敌对关系、中立关系和盟友关系。

输入样例

1 -1 0 0 -1

输出样例

1 0 0 0 0
0 -1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 -1

解题思路&C++题解

算法1

(暴力枚举) O(n2)O(n^2)O(n2)

对于每个家族,枚举其他四个家族,如果两个家族之间有关系,就在矩阵中记录下来。

C++ 代码:

#include <iostream>
using namespace std;const int N = 5;int main()
{int a[N][N];for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)cin >> a[i][j];for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else if (a[i][j] == 1) cout << "1 ";else if (a[i][j] == -1) cout << "-1 ";else cout << "0 ";}cout << endl;}return 0;
}

算法2

(暴力枚举) O(n2)O(n^2)O(n2)

和算法1相似,但是使用了一个二维数组来存储家族之间的关系,这样就可以直接访问数组来判断两个家族之间的关系,而不需要枚举。

C++ 代码:

#include <iostream>
using namespace std;const int N = 5;int main()
{int a[N][N];for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)cin >> a[i][j];for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else cout << a[i][j] << " ";}cout << endl;}return 0;
}

算法3

(暴力枚举) O(n2)O(n^2)O(n2)

和算法2相似,但是使用了邻接矩阵来存储家族之间的关系。邻接矩阵是一种常见的图论数据结构,它用二维数组表示图中节点之间的边。在这道题中,每个家族就是图中的一个节点,家族之间的关系就是边。使用邻接矩阵可以更方便地表示和操作图中的节点和边。

C++ 代码:

#include <iostream>
using namespace std;const int N = 5;int main()
{int a[N][N];for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)cin >> a[i][j];for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else if (a[i][j] == 1 || a[j][i] == 1) cout << "1 ";else if (a[i][j] == -1 || a[j][i] == -1) cout << "-1 ";else cout << "0 ";}cout << endl;}return 0;
}

算法4

(暴力枚举) O(n2)O(n^2)O(n2)

和算法3相似,但是使用了邻接表来存储家族之间的关系。邻接表是另一种常见的图论数据结构,它用链表表示图中节点之间的边。在这道题中,每个家族就是图中的一个节点,家族之间的关系就是边。使用邻接表可以更方便地表示和操作图中的节点和边。

C++ 代码:

#include <iostream>
#include <vector>
using namespace std;const int N = 5;int main()
{vector<int> a[N];for (int i = 0; i < N; i++)for (int j = 0; j < N; j++){int x;cin >> x;if (x != 0) a[i].push_back(j);}for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else{bool flag = false;for (int k = 0; k < a[i].size(); k++){if (a[i][k] == j){cout << "1 ";flag = true;break;}}if (!flag) cout << "0 ";}}cout << endl;}return 0;
}

算法5

(暴力枚举) O(n2)O(n^2)O(n2)

和算法4相似,但是使用了边集数组来存储家族之间的关系。边集数组是另一种常见的图论数据结构,它用一个数组来表示图中的边。在这道题中,每个家族就是图中的一个节点,家族之间的关系就是边。使用边集数组可以更方便地表示和操作图中的节点和边。

C++ 代码:

#include <iostream>
#include <utility>
using namespace std;const int N = 5;int main()
{pair<int, int> a[N * N];int cnt = 0;for (int i = 0; i < N; i++)for (int j = 0; j < N; j++){int x;cin >> x;if (x != 0) a[cnt++] = make_pair(i, j);}for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else{bool flag = false;for (int k = 0; k < cnt; k++){if (a[k].first == i && a[k].second == j){cout << "1 ";flag = true;break;}}if (!flag) cout << "0 ";}}cout << endl;}return 0;
}

算法6

(并查集) O(n)O(n)O(n)

使用并查集来维护五个家族之间的关系。并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。在这道题中,可以将每个家族看作一个集合,然后使用并查集来维护五个家族之间的关系。

首先,将每个家族初始化为一个单独的集合。然后,对于输入的每一对家族之间的关系,使用并查集的合并操作将这两个家族合并为一个集合。最后,遍历五个家族,对于每个家族,输出它和其他四个家族之间的关系。

C++ 代码:

#include <iostream>
using namespace std;const int N = 5;int fa[N];int find(int x)
{if (fa[x] != x) fa[x] = find(fa[x]);return fa[x];
}int main()
{for (int i = 0; i < N; i++) fa[i] = i;for (int i = 0; i < N; i++){int x, y;cin >> x >> y;int fx = find(x), fy = find(y);if (fx != fy) fa[fx] = fy;}for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (i == j) cout << "0 ";else if (find(i) == find(j)) cout << "1 ";else cout << "-1 ";}cout << endl;}return 0;
}

算法7

(深度优先搜索) O(n2)O(n^2)O(n2)

使用深度优先搜索来维护五个家族之间的关系。深度优先搜索是一种图论算法,用于遍历图中的所有节点。在这道题中,每个家族就是图中的一个节点,家族之间的关系就是边。

首先,初始化五个家族之间的关系矩阵。然后,对于输入的每一对家族之间的关系,使用深度优先搜索的遍历操作来更新五个家族之间的关系矩阵。最后,输出五个家族之间的关系矩阵。

C++ 代码:

#include <iostream>
using namespace std;const int N = 5;int a[N][N];void dfs(int x, int y)
{a[x][y] = 1;for (int i = 0; i < N; i++)if (a[y][i] == 1 && a[x][i] == 0)dfs(x, i);
}int main()
{for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)cin >> a[i][j];for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)if (a[i][j] == 1) dfs(i, j);for (int i = 0; i < N; i++){for (int j = 0; j < N; j++)cout << a[i][j] << " ";cout << endl;}return 0;
}

第二题:柯里昂家族树

题目描述

在《教父》中,柯里昂家族是一个著名的黑手党家族,由家族的首领柯里昂(Don Corleone)和他的四个儿子构成。柯里昂家族的家谱是一棵二叉树,其中柯里昂是根节点,他的儿子们分别是他的左儿子和右儿子。

现在,你需要编写一个程序,读入一个包含若干行的字符串,每行表示一个人的信息。每行的格式如下:

<人物名称> is the <父亲名称>'s <儿子>

其中,人物名称是一个不包含空格的字符串,父亲名称和儿子也是一个不包含空格的字符串。

例如,下面是一棵柯里昂家族的家谱:

Don Corleone is the Don’s son
Fredo Corleone is the Don’s son
Michael Corleone is the Don’s son
Tom Hagen is the Don’s adopted son

你的程序需要按照这些信息建立一棵二叉树,并输出这棵树的前序遍历。

例如,对于上面的家谱,输出应该是:

Don Corleone Fredo Corleone Michael Corleone Tom Hagen

你的程序需要支持以下功能:

  • 建立二叉树。你需要定义一个结构体表示一个节点,包含人物名称、左儿子和右儿子三个字段。你需要编写一个函数,读入若干行字符串,根据字符串中的信息建立二叉树。

  • 输出前序遍历。你需要编写一个函数,输出给定二叉树的前序遍历。

约定

  • 人物名称和父亲名称均由不超过 100 个字符组成,且不包含空格。
  • 儿子的值可能是 “son” 或 “adopted son”。
  • 输入中可能会出现重名的人物,你的程序需要处理这种情况。
  • 输入的字符串保证是合法的,不会出现父亲名称找不到的情况。

输入格式

输入的第一行包含一个整数 n(1 <= n <= 1000),表示字符串的行数。

接下来的 n 行,每行包含一个字符串,表示一个人的信息。字符串的格式如上文所述。

输出格式

输出给定二叉树的前序遍历,每个人物名称占一行。

输入样例

4
Don Corleone is the Don's son
Fredo Corleone is the Don's son
Michael Corleone is the Don's son
Tom Hagen is the Don's adopted son

输出样例

Don Corleone
Fredo Corleone
Michael Corleone
Tom Hagen

解题思路&C++题解

算法1

(暴力枚举) O(n2)O(n^2)O(n2)

对于每个节点,遍历整棵树,找到他的父亲节点,然后将他作为父亲节点的左儿子或右儿子,听起来很奇怪

【有料c++题目周刊 | 第六期】The Godfather相关推荐

  1. 【有料c++题目周刊 | 第四期】贝克街神探

    文章目录 第一题:贝克街解码 题目描述 输入格式 输出格式 数据范围 输入样例 输出样例 解题思路&C++题解 第二题:福尔摩斯的案件调查 题目描述 输入样例 输出样例 解题思路&C+ ...

  2. 科技周刊第六期:接近本质的东西才会长远

    这里记录每周值得分享的东西,每周五发布. 封面图 中国西南西藏自治区山南市扎南县的雅鲁藏布江(出处) 本周话题:接近本质的东西才会长远 我想说三个现象: 1.为什么很多明星能够一直红下去?而有的明星只 ...

  3. 科技周刊第七期:关于熟练程度的等级

    封面图 在美国威斯康星州Lambeau球场,大约8000名球迷参加了绿湾包装工队对阵洛杉矶公羊队的延长赛.由于冠状病毒大流行,这是2020赛季中所有季票持有人首次能够在此场地参加比赛.(出处) 本周话 ...

  4. 科技周刊第八期:苹果与特斯拉的相似之处

    这里记录每周值得分享的东西,每周五发布. 封面图 站在曼哈顿户外观景台Edge上的人们后面满月升起(出处) 本周话题:苹果与特斯拉的相似之处 如果要问谁是下一个乔布斯,估计很多人都会想到马斯克. 如果 ...

  5. 飞谷云六期第三组——基于Spark的机器学习

    项目正式开始时间:2015.10.15. 随笔内容:本次项目的主题是基于Spark的ML.对于ML的学习有大概半年了,正好在网上关注到了由上海交通大学所主办的这个飞谷云的大数据项目,我所报名的这期已经 ...

  6. 阿里云MVP第六期发布——覆盖全球20多个国家和地区,成为数字化转型的中坚力量...

    9月27日,阿里云MVP(最有价值专家)第六期发布.截止本期,全球已有20多个国家和地区,300余位云计算专家成为阿里云MVP. 2017 年 6 月,阿里云总裁胡晓明在上海云栖大会上发布了阿里云MV ...

  7. 【码云周刊第 3 期】来自国内开发者的实战项目,开源让通讯从未如此简单!...

    为什么80%的码农都做不了架构师?>>>    类型:即时通讯 "小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头-- " 春节将至,思乡心切,小一情不自禁的想 ...

  8. CSDN竞赛—第六期题解与感想

    CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 CSDN竞赛-第六期题解与感想 前言/背景 参赛经历 解题思路 经验心得 资料分享 第六期题解 ...

  9. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

最新文章

  1. 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
  2. 快速排序算法_常用排序算法之快速排序
  3. [Linux命令]Sed命令参数
  4. DBeaver中event实验
  5. JRockit JRCMD教程
  6. 计算机作文叙事,电脑争夺战叙事作文
  7. winform下自绘提示框风格窗体
  8. 2022年全球差旅费管理系统行业分析报告
  9. 【机器人算法】机器人运动学参数辨识/DH参数校准/DH参数辨识
  10. 计算机及软件工程专业职称,有关软件工程师职称
  11. 编程实现恩格玛加密机(C++)
  12. 大数据还能火多久?现在学习还来得及吗?
  13. 算法设计与分析第五章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  14. 《设计模式入门》 19.命令模式
  15. 高数 | 洛必达法则的隐藏细节、广义洛必达法则(分母无穷直接洛必达)使用条件
  16. FRP + 腾讯云 内网穿透
  17. 解决ie浏览器el-select选择后出现光标的问题
  18. 人脸识别开源项目--insightface
  19. 银行的表内、表外和通道
  20. Android'图表MPAndroidchart 的BarChart

热门文章

  1. HDU 4343 贪心+倍增
  2. 中文奇数乱码解决方案
  3. 苹果手机怎么关机?2个方法,教你快速关机
  4. Google图书也是可以下载的
  5. JS高级—call(),apply(),bind()
  6. 轻松集成腾讯云短信服务实现短信发送(Java实现)
  7. “俄罗斯讨论自研游戏引擎”解读
  8. vue动画基础实践,让你的页面更加丝滑
  9. 如何一步步从数据产品菜鸟走到骨干数据产品
  10. PHP获取今天、昨天、明天的日期