70.矩阵问题
题目描述
从键盘上输入一个整数N,按以下规律输出一个(2N+1)*(2N+1)的矩阵:
对角线的值为1,
上半三角区域值为2,
下半三角区域值为3,
左半三角区域的值为4,
右半三角区域的值为5。
代码
cpp
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n) {
int size = 2 * n + 1; // 矩阵的边长
for (int i = 0; i < size; ++i) { // i 代表行号
for (int j = 0; j < size; ++j) { // j 代表列号
// 控制空格格式:行首不输出空格,数字之间用空格分隔
if (j > 0) {
cout << " ";
}
// 1. 对角线:主对角线 (i == j) 或 副对角线 (i + j == size - 1)
if (i == j || i + j == size - 1) {
cout << 1;
}
// 2. 上半三角区域:在主对角线上方 (i < j) 且在副对角线上方 (i + j < size - 1)
else if (i < j && i + j < size - 1) {
cout << 2;
}
// 3. 下半三角区域:在主对角线下方 (i > j) 且在副对角线下方 (i + j > size - 1)
else if (i > j && i + j > size - 1) {
cout << 3;
}
// 4. 左半三角区域:在主对角线下方 (i > j) 且在副对角线上方 (i + j < size - 1)
else if (i > j && i + j < size - 1) {
cout << 4;
}
// 5. 右半三角区域:剩下的即为右边:
else {
cout << 5;
}
}
// 每一行输出结束后换行
cout << endl;
}
}
return 0;
}
总结
为了确定每个位置 应该输出什么数字,我利用了矩阵的两条对角线作为分界线:主对角线:满足 i == j。副对角线:满足 i + j == size - 1。
两条线将矩阵分成了上下左右四个部分。所以通过 iii 和 jjj 的关系来判断当前坐标落在哪个区域:
- 上方 (值 2):行号小于列号 (
i < j) 且 行号+列号小于最大索引 (i + j < size - 1)。 - 下方 (值 3):行号大于列号 (
i > j) 且 行号+列号大于最大索引 (i + j > size - 1)。 - 左边 (值 4):行号大于列号 (
i > j) 且 行号+列号小于最大索引 (i + j < size - 1)。 - 右边 (值 5):剩下的区域,即行号小于列号 (
i < j) 且 行号+列号大于最大索引 (i + j > size - 1)。
71.模拟发牌
题目描述
编制一个模拟发牌的程序。有编号为1,2,3,4四个人,将一付去掉大小怪的扑克按照如下顺序排列梅花c0-c12,方块d0-d12,红桃h0--h12,黑桃s0-s12,然后按照1,2,3,4四个人的顺序发牌,问最后每个人手上的牌有哪些。
代码
cpp
#include <iostream>
using namespace std;
int main() {
// 索引 0->c, 1->d, 2->h, 3->s
char suits[4] = {'c', 'd', 'h', 's'};
int player;
while (cin >> player) {
for (int k = 0; k < 13; k++) {
// 算出这张牌在 0-51 中的绝对编号
int cardIndex = (player - 1) + k * 4;
// 花色 = 编号 / 13 (整除得到 0, 1, 2, 3)
// 点数 = 编号 % 13 (取余得到 0-12)
char s = suits[cardIndex / 13];
int n = cardIndex % 13;
if (k > 0) cout << " ";
cout << s << " " << n;
}
cout << endl;
}
return 0;
}
总结
/ 13:用来确定花色。比如编号 14,14 / 13 = 1,对应数组里的 suits[1] 即 d (方块)。
% 13:用来确定点数。比如编号 14,14 % 13 = 1,就是方块 1。
72.数字金字塔
题目描述
考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
代码
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int R;
if (!(cin >> R)) return 0;
// 使用二维 vector 存储金字塔
vector<vector<int>> pyramid(R);
入
for (int i = 0; i < R; ++i) {
pyramid[i].resize(i + 1);
for (int j = 0; j <= i; ++j) {
cin >> pyramid[i][j];
}
}
// dp[j] 表示当前行第 j 个位置到底部的最大和
// 初始化 dp 数组为最后一行的值
vector<int> dp = pyramid[R - 1];
// 从倒数第二行 (R-2) 开始向上遍历到第 0 行
for (int i = R - 2; i >= 0; --i) {
for (int j = 0; j <= i; ++j) {
// 当前位置的最大路径 = 当前值 + max(左下角路径和, 右下角路径和)
dp[j] = pyramid[i][j] + max(dp[j], dp[j + 1]);
}
}
cout << dp[0] << endl;
return 0;
}
总结
可以复用一个数组(或者直接修改原数组),让每个位置存储"从该位置出发到底部所能获得的最大和"。对于位置 (i, j),它只能走到下一层的 (i+1, j) 或 (i+1, j+1)。为了让总和最大,我们肯定选这两个分支中较大的那个。计算完成后,金字塔顶端 DP[0][0] 的值就是我们要找的最大路径和。
翻译
许多技术可应用于构建物联网基础设施和用于特定应用领域的特定物联网系统。支持性技术分为两类。使能技术(Enabling technologies)构建了物联网的基础。在使能技术中,追踪(RFID)、传感器网络和 GPS 至关重要。
RFID 通过电子标签或 RFID 标签应用于任何被监控或追踪的物体上。这些标签可以应用于任何物体,例如商品、工具、智能手机、计算机、动物或人。其目的是利用无线电波或感测信号来识别和追踪物体。有些标签可以通过无线阅读器在数十或数百米外被读取。大多数 RFID 标签至少包含两个主要部分。一个是集成电路,用于存储和处理信息、调制和解调射频(RF)信号以及其他特殊功能。另一部分是用于接收和发送无线电信号的天线。
今天的传感器网络大多是无线的,被称为无线传感器网络(WSN)。一个典型的 WSN 由空间分布的自主传感器组成,用于协作监控物理或环境状况,如温度、声音、振动、压力、运动或污染物。无线传感器网络的发展最初是由军事应用(如战场监视)推动的。如今,WSN 技术已用于许多工业和民用应用领域,包括过程监控与控制、机器健康监控、环境和栖息地监控、医疗保健和家庭自动化以及智能交通控制。
GPS 是由美国空军于 1973 年开发的。欧盟、俄罗斯和中国也出现了类似的发展。自 1994 年以来,一种降级版(精度受限)的 GPS 已可供民用,提供可靠的定位、导航和授时服务。对于任何拥有 GPS 接收器的人来说,该系统都能在世界任何地方、任何天气条件下、不分昼夜地为无限数量的用户提供精确的位置和时间信息。
synergistic ------ 协同的 / 协作的
infrastructure ------ 基础设施
domains ------ 领域 / 范围
merchandise ------ 商品 / 货物
integrated circuit ------ 集成电路
modulating ------ 调制
demodulating ------ 解调
antenna ------ 天线
autonomous ------ 自主的 /自治的
cooperatively ------ 合作地 / 协作地
pollutants ------ 污染物
surveillance ------ 监视 / 监控
habitat ------ 栖息地
degraded ------ 降级的 / 退化的(文中指精度降低的民用信号)
