2月12日打卡

一、稀疏矩阵

题目:

今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是0,我们称这类矩阵为稀疏矩阵。 于是,明明发明了一种简单的表示方法,只指出矩阵中非零元素来表示该矩阵。

例如一个矩阵:

0 0 0 5

2 0 0 0

0 1 0 0

0 0 4 0

可以表示成:

1 4 5

2 1 2

3 2 1

4 3 4

但明明又开始力不从心了,于是再一次想到了你...

明明的问题可以归结为:试编程将一个稀疏矩阵a转换成只存放非零元素的矩阵b,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列以及它的值。

输入说明:

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。

每组数据的第一行包括两个整数,M和N,用空格隔开,表示矩阵大小为M * N(1 ≤ M, N ≤ 20),之后的M行每行有N个整数,也用空格隔开,整数的大小不会超出int型,且必有一个数非零。行首行尾没有空格,每组测试数据之间也没有多余空行。

输出说明:对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。对应每组输入数据,用明明的矩阵表示法输出该矩阵,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列(行、列下标从1开始)以及它的值。其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

个人总结:

本题使用的算法本质上是二维数组的顺序遍历算法。程序首先通过 while (scanf_s("%d %d", &M, &N) == 2) 实现多组数据的读取,然后用一个二维数组存储输入的矩阵元素。接着采用两层循环按照行优先顺序(即从上到下、从左到右)遍历整个矩阵,对每一个元素进行判断,如果元素不为 0,就输出它所在的行号、列号以及对应的值。由于矩阵规模最大为 20×20,算法时间复杂度为 O(M×N),属于简单的线性扫描。

本题的核心思想是稀疏矩阵的三元组表示法,即只记录非零元素的位置和数值,从而避免存储大量无意义的 0。实现上并没有使用复杂的数据结构,而是通过完整遍历筛选非零元素来实现转换。难点主要集中在两个方面:第一是必须保证遍历顺序正确,题目要求"从左到右、从上到下",因此必须使用按行遍历的顺序;第二是输出格式的控制,尤其是多组数据之间需要有一个空行,而最后一组结果后不能多输出空行,如果处理不当容易产生格式错误。总体来看,这是一道典型的二维数组遍历与格式控制相结合的模拟题,重点在细节而不在算法复杂度。

代码:

#include <stdio.h>

int main()

{

int M, N;

while (scanf_s("%d %d", &M, &N) == 2)

{

int squre[21][21] = { 0 };

for (int i =1; i <=M; i++)

{

for (int j = 1; j <=N; j++)

{

scanf_s("%d", &squre[i][j]);

}

}

for (int i = 1; i <=M; i++)

{

for (int j = 1; j <=N; j++)

{

if (squre[i][j] != 0)

{

printf("%d %d %d\n", i, j, squre[i][j]);

}

}

}

printf("\n");

}

return 0;

}

二、矩阵转换

题目:

明明是一个很聪明的孩子,学什么东西都很快。但是他也有个缺点,就是不愿意做重复的劳动,往往学会一样东西以后,就不太愿意再去碰它。有一天,明明在数学课上学了矩阵的转换,即有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行交换,然后形成一个新的矩阵。

例如:有个3×3的矩阵如下:

1 2 3

4 5 6

7 8 9

通过以左上到右下的对角线交换后,形成了一个新的矩阵:

1 4 7

2 5 8

3 6 9

明明很快就学会了,然后自己动手做了几个类似的转换。但是,课后老师布置了很多矩阵转换的作业,让同学回家练习,这就使明明很厌烦了,觉得自己已经学会了,就没有再练习的必要了。于是明明就请你帮个忙,帮他写一个程序,来计算矩阵的交换,帮他完成老师布置的作业。

明明的问题可以归结为:有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行转换,然后输出转换后的矩阵。

输入说明:你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有多行,每组测试数据的第一行有一个整数r(1≤r≤10),表示一个r×r的矩阵,接下来有r行,每行有r个整数,表示要转换的矩阵中的数,每个数用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明:对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个转换后的矩阵。每组运算结果形成r行数据,每一行的数字之间以一个空格分隔,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

个人总结:

这道题本质上实现的是矩阵的转置操作。所谓"以左上到右下的对角线进行交换",实际上就是以主对角线为轴,把矩阵元素 a[i][j]a[i][j]a[i][j] 变为 a[j][i]a[j][i]a[j][i]。程序中并没有真正去交换原矩阵中的元素,而是在输出阶段直接通过下标互换来实现转置效果,即在输出第 i 行第 j 列位置时,实际输出的是原矩阵中的 squre[j][i]。这种做法本质上是一种映射输出的方法,不改变原数组内容,通过访问方式的变化实现矩阵转换。

算法整体流程是:通过 while 循环不断读取多组数据;每读入一个整数 r,就创建一个 r×r 的二维数组存储矩阵元素;随后用两重循环完成矩阵输入;接着再次使用两重循环输出转换后的矩阵。在输出阶段,通过将行列下标互换实现转置,即原来的第 i 行第 j 列元素变为新矩阵的第 j 行第 i 列元素。时间复杂度为 O(r²),因为无论输入还是输出都需要遍历整个矩阵。由于 r ≤ 10,规模很小,属于典型的二维数组模拟问题。

代码:

#include <stdio.h>

int main()

{

int r;

while (scanf_s("%d", &r) == 1)

{

int squre[11][11] = { 0 };

for (int i = 0; i < r; i++)

{

for (int j = 0; j < r; j++)

{

scanf_s("%d", &squre[i][j]);

}

}

for (int i = 0; i < r; i++)

{

for (int j = 0; j < r; j++)

{

if (j < r-1)

{

printf("%d ", squre[j][i]);

}

else

{

printf("%d", squre[j][i]);

}

}

printf("\n");

}

printf("\n");

}

return 0;

}

三、魔方阵

题目:

在一次数学课上,明明的老师讲了一种非常有趣的方阵,称之为三阶魔方阵。

它是一个三行三列,由1、2、3、......8、9,九个数字共同构成,且它每行、每列、两对角线之和均相等,于是一个合法的三阶魔方阵就形成了以下的方阵:

8 1 6

3 5 7

4 9 2

富有钻研精神的明明回家后,马上就对三阶魔方阵进行研究。

他总结出了5条n阶魔方阵的规律(n为奇数),如下:

(1) 将"1"放在第一行(最上面一行)中间一列;

(2) 从"2"开始直到n*n为止各数依次按下列规则存放:每一个数存放的行的行数比前一个数的行数减1,每一个数存放的列的列数比前一个数的列数加1,即前一个数的右上方。

(3) 如果上一数的行数为1,则下一个数的行数为n(指最下面一行);

(4) 当上一个数的列数为n时,下一个数的列数应为1(指最左一列);

(5) 如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

有了以上的方法,明明就可以轻易地构造出任意的n阶魔方阵。

例如构造3阶魔方阵的过程如下:

先将1放在第一行的中间一列:

放1:(参考规则1)

* 1 *

* * *

* * *

放2:(参考规则3)

* 1 *

* * *

* * 2

放3:(参考规则4)

* 1 *

3 * *

* * 2

放4:(参考规则5)

* 1 *

3 * *

4 * 2

放5:(参考规则2)

* 1 *

3 5 *

4 * 2

放6:(参考规则2)

* 1 6

3 5 *

4 * 2

放7:(参考规则5)

* 1 6

3 5 7

4 * 2

放8:(参考规则4)

8 1 6

3 5 7

4 * 2

放9:(参考规则3)

8 1 6

3 5 7

4 9 2

但是随着n的不断增大,构建一个n阶魔方阵所花的精力就越多。于是明明就请你帮忙,帮助他用程序来构建n阶魔方阵。

明明的问题可以归结为:给你一个阶数n,请你按照题目中描述的方法,构造出n阶魔方阵。

输入说明:你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤19,且n是奇数),表示要构造的魔方阵阶数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明:对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。输出时,每组运算结果为n阶魔方阵。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

个人总结:

这道题实现的是奇数阶魔方阵的构造算法,本质上采用的是经典的"暹罗法"(Siamese Method),也叫奇数阶魔方阵构造算法。其核心思想是按照固定的移动规则依次放置数字 1 到 n²,通过坐标计算与规则判断来完成整个矩阵的构建。

程序整体采用模拟算法实现。首先通过 while 循环读取多组数据,每读入一个奇数 n,就构造一个 n×n 的二维数组并初始化为 0。根据规则,先将数字 1 放在第一行中间列,即 row = 0,col = n/2。随后从 2 到 n*n 依次放入矩阵。每次放置新数字时,先按照"右上方"规则计算下一个位置,即行减 1,列加 1,然后处理越界情况:如果行号小于 0,就跳到最后一行;如果列号等于 n,就回到第 0 列。接着判断目标位置是否已经有数字,如果有,则说明不能按右上方放置,而应改为放在"上一个位置的正下方",即行加 1、列不变。确定最终位置后,将当前数字填入数组,并更新当前位置。整个过程是对题目五条规则的完整程序化实现。

本题的关键在于正确理解构造规则并将其转化为坐标运算。难点主要集中在三个方面:第一,要准确实现"右上移动"以及行列越界后的循环回绕,这是典型的二维数组环绕处理;第二,要正确判断目标位置是否已经被占用,这是算法能否形成合法魔方阵的核心,如果遗漏这一判断会导致覆盖已有数字;第三,多组数据的输出格式控制较为严格,每组结果之间需要一个空行,但最后一组后不能多输出空行,而当前代码在每组后都直接输出一个换行符,可能导致最后多一个空行,从而在严格评测中出现格式错误。

代码:

#include <stdio.h>

int main() {

int n;

while (scanf_s("%d", &n) == 1)

{

int a[105][105] = { 0 }; // 足够大即可

int row = 0;

int col = n / 2;

a[row][col] = 1;

for (int num = 2; num <= n * n; num++) {

int next_row = row - 1;

int next_col = col + 1;

// 规则 3:越上边

if (next_row < 0)

next_row = n - 1;

// 规则 4:越右边

if (next_col == n)

next_col = 0;

// 规则 5:位置已有数 或 特殊角落

if (a[next_row][next_col] != 0) {

next_row = row + 1;

next_col = col;

}

a[next_row][next_col] = num;

row = next_row;

col = next_col;

}

// 输出结果

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

if (j) printf(" ");

printf("%d", a[i][j]);

}

printf("\n");

}

printf("\n");

}

return 0;

}

四、英语翻译

1.Various compute and storage clouds and grids are used toprocess the data and transform it into information andknowledge formats. The sensed information is used to puttogether a decision-making system for intelligence applications.The middle layer is also considered as a Semantic Web or Grid.Some actors (services, components, avatars) are self-referenced.

各种计算与存储云平台以及网格系统被用来处理数据,并将其转换为信息和知识形式。感知得到的信息被用于构建面向智能应用的决策系统。中间层也可以被视为语义网或网格环境,其中某些参与者(如服务、组件或虚拟代理)具有自引用特性。

2.Table 12C-2 summarizes loT applications in three major civilianapplication domains. Obviously, the loT has a lot of militaryapplications, which is beyond the scope of this section. Ingeneral, use of the loT aims to promote industrial productivityand raise economic growth. The loT plays important roles inenvironment protection, including pollution control, weatherforecasting, and disaster avoidance and recovery. In terms ofsocietal impacts, the loT can make our lives more convenientand comfortable. Government services, law enforcement, and home and health improvements are the major beneficiaries. Inthe remaining space of this section, we will briefly discuss someof the application domains.

表 12C-2 总结了物联网在三大主要民用领域中的应用。显然,物联网在军事领域也有大量应用,但这超出了本节讨论范围。总体而言,物联网的应用旨在提升工业生产效率并促进经济增长。物联网在环境保护方面发挥着重要作用,包括污染控制、天气预报以及灾害预防与恢复。在社会影响方面,物联网能够使我们的生活更加便利和舒适。政府服务、执法管理以及家庭与医疗健康改善都是其主要受益领域。本节剩余部分将简要介绍其中一些应用领域。

3.Emergence of RFID applications depends strongly on adoptionby retailers, logistics organizations, and package-deliverycompanies. In particular, retailers may tag individual objects in order to solve a number of problems at once: accurateinventorying, loss control, and ability to support unattendedwalk-through point of sale terminals (which promise to speedcheckout while reducing both shoplifting and labor costs).Cold-chain auditing and assurancecould require taggingfood and medicine with temperature-sensitive materials and/orelectronics; ensuringormonitoring whether perishablematerials are intact and/or need attention mayentailcommunicationsamongthings, refrigerationsystems,automated data logging systems, and human technicians.

RFID 应用的兴起在很大程度上依赖于零售商、物流组织以及快递公司的采纳。尤其是零售商可以为单个商品贴上标签,从而一次性解决多个问题,例如实现精确库存管理、控制损耗,以及支持无人值守的自助结账终端(这种方式有望加快结账速度,同时减少盗窃和人工成本)。冷链审计与保障可能需要为食品和药品配备温度敏感材料和/或电子标签;确保或监控易腐物品是否完好、是否需要关注,可能涉及物品之间、制冷系统、自动数据记录系统以及人工技术人员之间的通信。

五、单词打卡

相关推荐
We་ct1 小时前
LeetCode 138. 随机链表的复制:两种最优解法详解
前端·算法·leetcode·链表·typescript
藦卡机器人1 小时前
国产激光焊接机器人品牌
大数据·人工智能·机器人
Mixtral1 小时前
4款语音转写工具测评:告别手动记录,提升工作效率
人工智能·ai
向量引擎小橙2 小时前
从“对话助手”到“数字架构师”:Claude 4.6 Opus 如何凭一己之力,终结全球程序员的“CRUD 焦虑”?
人工智能·python·gpt·深度学习
llz_1122 小时前
蓝桥杯备赛-搜索(DFS/BFS)
c++·算法·蓝桥杯·深度优先·宽度优先
njsgcs2 小时前
ACuRL用于环境适应的计算机使用代理的自主持续学习 论文阅读
人工智能
小鸡吃米…2 小时前
TensorFlow - 单层感知机
人工智能·python·tensorflow
流云细水2 小时前
Spec(规格说明书)与Skill(技能库)实操指南
java·人工智能