oj基础70 矩阵问题
作者: Turbo
时间限制: 1s
章节: 二维数组
问题描述
从键盘上输入一个整数N,按以下规律输出一个(2N+1)*(2N+1)的矩阵:
对角线的值为1,
上半三角区域值为2,
下半三角区域值为3,
左半三角区域的值为4,
右半三角区域的值为5。
输入说明
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组测试数据数据占一行,大于零,小于等于8。
输出说明
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的终端)依次输出符合要求的矩阵,每行数据与数据之间以空格分隔,在行首和行尾不要输出多余的空格。在所有数据前后,以及两组数据之间不要输出多余的空行。
代码
cpp
#include <iostream>
#include <cmath>
using namespace std;
// 生成并输出指定N对应的矩阵
void printMatrix(int N) {
int size = 2 * N + 1;
int mid = N; // 矩阵中心位置的下标(0开始)
for (int i = 0; i < size; ++i) { // 遍历每一行
for (int j = 0; j < size; ++j) { // 遍历每一列
int val;
// 1. 判断是否是对角线
if (i == j || (i + j) == 2 * N) {
val = 1;
}
// 2. 上半三角区域
else if (i < mid - abs(j - mid)) {
val = 2;
}
// 3. 下半三角区域
else if (i > mid + abs(j - mid)) {
val = 3;
}
// 4. 左半三角区域
else if (j < mid - abs(i - mid)) {
val = 4;
}
// 5. 右半三角区域
else {
val = 5;
}
if (j == 0) {
cout << val;
} else {
cout << " " << val;
}
}
cout << endl;
}
}
int main() {
int N;
bool first_case = true; // 标记是否是第一组数据(控制空行)
while (cin >> N) {
printMatrix(N);
first_case = false;
}
return 0;
}
个人总结
记住思路,要知道上半三角,下半三角,左半三角和右半三角怎么写代码
oj基础71 发牌
作者: 朱星垠
时间限制: 2s
章节: 二维数组
问题描述
编制一个模拟发牌的程序。有编号为1,2,3,4四个人,将一付去掉大小怪的扑克按照如下顺序排列梅花c0-c12,方块d0-d12,红桃h0--h12,黑桃s0-s12,然后按照1,2,3,4四个人的顺序发牌,问最后每个人手上的牌有哪些。
输入说明
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成。每组数据包含一个在1到4之间的整数,代表四个人中的一个,在行首和行尾没有多余的空格。
输出说明
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。对于每组输入,输出那个人手上的牌。每组一行。每行包括13张牌,每张牌由牌的花色和牌的大小组成。牌的花色和牌的大小之间有一个空格,前后两张牌之间也有一个空格。其余数据前后没有多余的空格,两组数据之间也没有多余的空行。
代码
cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 初始化所有牌的序列(梅花c0-c12 → 方块d0-d12 → 红桃h0-h12 → 黑桃s0-s12)
vector<string> initCards() {
vector<string> cards;
// 顺序:梅花c、方块d、红桃h、黑桃s
vector<char> suits = {'c', 'd', 'h', 's'};
// 生成52张牌
for (char suit : suits) {
for (int num = 0; num <= 12; num++) {
cards.push_back(string(1, suit) + " " + to_string(num));
}
}
return cards;
}
// 玩家手上的牌
vector<string> getPlayerCards(int playerNum, const vector<string>& allCards) {
vector<string> playerCards;
// 玩家的起始索引
int startIdx = playerNum - 1;
// 步长为4,取13张牌
for (int i = 0; i < 13; i++) {
int idx = startIdx + i * 4;
playerCards.push_back(allCards[idx]);
}
return playerCards;
}
void printCards(const vector<string>& cards) {
for (int i = 0; i < cards.size(); i++) {
if (i == 0) {
cout << cards[i];
} else {
cout << " " << cards[i];
}
}
cout << endl;
}
int main() {
// 初始化
vector<string> allCards = initCards();
int playerNum;
// 读取
while (cin >> playerNum) {
vector<string> playerCards = getPlayerCards(playerNum, allCards);
printCards(playerCards);
}
return 0;
}
个人总结
总结发牌逻辑,先按固定顺序生成 52 张牌,再 "起始索引 + 步长 4" 的方式分配给 4 个玩家,保证发牌顺序符合 1→2→3→4 的规则
oj基础72 数字金字塔
作者: xxx
时间限制: 1s
章节: 二维数组
问题描述
考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入说明
第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。
输出说明
输出仅一行,包含那个可能得到的最大的和。
代码
cpp
#include <iostream>
#include <vector>
#include <algorithm> // 用于max函数
using namespace std;
int main() {
int R;
cin >> R;
// 用二维向量存储数字金字塔
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];
}
}
// 从倒数第二行开始向上递推 动态规划核心
for (int i = R - 2; i >= 0; --i) { // i从倒数第二行到第0行
for (int j = 0; j <= i; ++j) { // 遍历第i行的所有列
// 当前位置的最大和 = 自身值 + max(正下方, 右下方)
pyramid[i][j] += max(pyramid[i + 1][j], pyramid[i + 1][j + 1]);
}
}
// 顶部元素即为最大路径和
cout << pyramid[0][0] << endl;
return 0;
}
个人总结
动态规划核心思想:
-
从金字塔的最后一行开始,向上逐层计算每个位置能获得的最大路径和。
-
对于第
i行第j列的数字,其最大路径和 = 自身值 + max (正下方位置的最大和,右下方位置的最大和)。 -
最终金字塔顶部(第 0 行第 0 列)的值就是最大路径和。
oj基础73 稀疏矩阵
作者: 孙辞海
时间限制: 1s
章节: 二维数组
问题描述
今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是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开始)以及它的值。其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。
代码
cpp
#include <iostream>
#include <vector>
using namespace std;
// 存储非零元素的结构体
struct NonZeroElement {
int row; // 行号
int col; // 列号
int value; // 元素值
};
// 一组矩阵数据的转换和输出
void processMatrix() {
int M, N;
cin >> M >> N;
// 原始矩阵
vector<vector<int>> matrix(M, vector<int>(N));
// 非零元素
vector<NonZeroElement> nonZeroElements;
// 读取矩阵数据并提取非零元素
for (int i = 0; i < M; ++i) { // 遍历每一行
for (int j = 0; j < N; ++j) { // 遍历每一列
cin >> matrix[i][j];
if (matrix[i][j] != 0) {
nonZeroElements.push_back({i + 1, j + 1, matrix[i][j]});
}
}
}
for (size_t k = 0; k < nonZeroElements.size(); ++k) {
NonZeroElement elem = nonZeroElements[k];
cout << elem.row << " " << elem.col << " " << elem.value << endl;
}
}
int main() {
int count = 0;
while (!cin.eof()) {
if (count > 0) {
cout << endl;
}
processMatrix();
count++;
}
return 0;
}
个人总结
采用双重遍历,来读取矩阵的数据
英语
翻译
P7 一种仅用于显示文本和图像的计算机显示设备可被归类为输出设备。然而,触摸屏既可以作为输入设备,也可以作为输出设备,因为它们既接受输入,也显示输出。独立的显示设备(有时也称为显示器)在台式计算机中很常见。笔记本电脑、平板电脑和手持设备的显示设备则内置在系统单元中,但这些设备也可以外接显示器。目前有两种常用的显示设备技术:LCD(液晶显示器)和 LED。LCD(液晶显示器)技术通过一层液晶单元过滤光线来生成图像。LCD 屏幕的优点包括显示清晰、辐射低、便携性好且体积小巧。过滤光线穿过 LCD 的光源被称为背光。大多数现代屏幕都采用 LED(发光二极管)技术进行背光,并以 LED 显示器的名称进行市场推广。
P8 如今最畅销的多功能打印机采用喷墨或激光技术,还可以兼作扫描仪、复印机和传真机。喷墨打印机有一个类似喷嘴的打印头,它将墨水喷洒到纸张上以形成字符和图形。彩色喷墨打印机的打印头由一系列喷嘴组成,每个喷嘴都有自己的墨盒。激光打印机使用与复印机相同的技术,将墨粉点印在感光鼓上。带静电的墨水被施加到感光鼓上,然后转印到纸张上。一台基础的激光打印机只能打印黑白内容,而彩色激光打印机则使用青色、品红色、黄色和黑色(CMYK)四种墨粉。
P9 计算机的主存储器被组织成称为 "单元" 的可管理单元。为了体现可以按任意顺序访问单元的能力,计算机的主存储器通常被称为随机存取存储器(RAM)。RAM 是微处理器的 "候诊室"。它存放着等待处理的原始数据、处理这些数据的程序指令,以及控制计算机系统基本功能的操作系统指令。它还会保存处理结果,直到这些结果可以被转移到更永久的位置。
P10 ROM(只读存储器)包含一小套称为引导加载程序的指令和数据。引导加载程序的指令会告诉数字设备如何启动。通常,引导加载程序会执行自检,以确定硬件是否正常运行,还可能验证基本程序是否未被损坏。然后它将操作系统加载到 RAM 中。与 RAM 是临时且易失性的不同,ROM 更具永久性且是非易失性的。即使设备关闭,ROM 中的内容也会保持不变。
P11 大多数计算机都有额外的存储设备,称为大容量存储(或辅助存储)系统。个人计算机通常使用三种类型:磁存储、光存储和固态存储。
P12 磁存储通过磁化磁盘或磁带表面的微观粒子来表示数据。最早的个人计算机使用盒式磁带进行存储,不过很快就出现了软盘存储。如今,磁存储技术最常见的例子是磁盘或硬盘驱动器(HDD)。
单词
