C++算法竞赛篇(七)二维数组题型讲解
·
C++算法竞赛篇(七)二维数组题型讲解
前言
- 前面的题型里我们讲解一维数组题型讲解
- 本篇博客我们开始讲解二维数组题型讲解
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
C++ 二维数组题型讲解
第一题 杨辉三角

解题思路
-
输入处理:
- 读取整数
n(杨辉三角的行数)。
- 读取整数
-
核心逻辑:
- 杨辉三角的第
i行有i+1个元素,且每行首尾元素均为1(即j=0或i=j时,值为1)。 - 非首尾元素的值为上一行相邻两元素之和(即
arr[i][j] = arr[i-1][j-1] + arr[i-1][j],需满足i≥2且j≥1)。
- 杨辉三角的第
-
输出处理:
- 按行打印杨辉三角,每行元素用空格分隔,行末换行。
#include <iostream>
using namespace std;
int arr[25][25];
int main()
{
int n = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= i; j++)
{
if(j == 0)
arr[i][j] = 1;
if(i == j)
arr[i][j] = 1;
if(i >= 2 && j >= 1)
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}

第二题 图像相似度

解题思路
-
输入处理:
- 读取矩阵的行数
m和列数n。 - 依次读取两个
m×n的矩阵,分别存入arr1和arr2。
- 读取矩阵的行数
-
核心逻辑:
- 遍历两个矩阵的每个元素,统计对应位置元素相等的个数
c。
- 遍历两个矩阵的每个元素,统计对应位置元素相等的个数
-
输出处理:
- 计算相似度(
(相等元素个数 / 总元素个数) × 100%),并保留两位小数输出。
- 计算相似度(
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int arr1[N][N];
int arr2[N][N];
int m, n;
int main()
{
cin >> m >> n;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
cin >> arr1[i][j];
}
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
cin >> arr2[i][j];
}
}
int c = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(arr1[i][j] == arr2[i][j])
{
c++;
}
}
}
printf("%.2f\n", c * 1.0 / (m * n) * 100);
return 0;
}

第三题 矩阵转置

解题思路
-
输入处理:
- 读取原矩阵的行数
n和列数m。 - 读取
n×m的原矩阵,存入arr。
- 读取原矩阵的行数
-
核心逻辑:
- 矩阵转置即将原矩阵的行和列互换,转置后矩阵为
m×n,其中转置矩阵的[i][j]对应原矩阵的[j][i]。
- 矩阵转置即将原矩阵的行和列互换,转置后矩阵为
-
输出处理:
- 按转置后的矩阵结构打印,每行元素用空格分隔,行末换行。
#include <iostream>
using namespace std;
const int N = 110;
int arr[N][N];
int n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << arr[j][i] << " ";
}
cout << endl;
}
return 0;
}

第四题 图像模糊处理

解题思路
-
输入处理:
- 读取图像的行数
n和列数m。 - 读取
n×m的图像矩阵,存入arr1,并将arr2初始化为与arr1相同(用于存储处理后结果)。
- 读取图像的行数
-
核心逻辑:
- 仅处理非边缘元素(即行索引
1≤i≤n-2且列索引1≤j≤m-2)。 - 非边缘元素的新值为其自身与上下左右四个相邻元素的平均值(四舍五入处理)。
- 边缘元素保持原值不变。
- 仅处理非边缘元素(即行索引
-
输出处理:
- 打印处理后的矩阵
arr2,每行元素用空格分隔,行末换行。
- 打印处理后的矩阵
#include <iostream>
using namespace std;
const int N = 110;
int arr1[N][N]; // 旧数据
int arr2[N][N]; // 新数据
int n, m;
int main()
{
// 输入
cin >> n >> m;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cin >> arr1[i][j];
arr2[i][j] = arr1[i][j];
}
}
// 计算:仅处理非边缘元素(四舍五入平均)
for(int i = 1; i < n-1; i++)
{
for(int j = 1; j < m-1; j++)
{
arr2[i][j] = (int)((arr1[i][j] + arr1[i-1][j] + arr1[i][j-1] + arr1[i+1][j] + arr1[i][j+1]) / 5.0 + 0.5);
}
}
// 输出
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << arr2[i][j] << " ";
}
cout << endl;
}
return 0;
}

第五题 彩票摇奖

解题思路
-
输入处理:
- 读取彩票张数
n。 - 读取7个中奖号码,存入
ans数组。 - 依次读取
n张彩票的7个号码。
- 读取彩票张数
-
核心逻辑:
- 对每张彩票,统计与中奖号码匹配的个数
cnt。 - 中奖等级为
7 - cnt(例如:匹配7个为等级0,匹配6个为等级1,以此类推),用c数组统计各等级的数量。
- 对每张彩票,统计与中奖号码匹配的个数
-
输出处理:
- 打印
c数组中7个等级的统计结果,用空格分隔。
- 打印
#include <iostream>
using namespace std;
int ans[7]; // 中奖号码
int c[7]; // 中奖的个数统计
int main()
{
int n = 0;
cin >> n; // 输入彩票张数
// 输入中奖号码
for (int i = 0; i < 7; i++)
{
cin >> ans[i];
}
// 2. 处理 n 张彩票
for (int i = 0; i < n; i++)
{
int cnt = 0; // 记录当前彩票与中奖号码的匹配个数
int num; // 存储当前读取的彩票数字
// 读取当前彩票的 7 个数字
for (int j = 0; j < 7; j++)
{
cin >> num;
// 与中奖号码逐个比对
for (int k = 0; k < 7; k++)
{
if (ans[k] == num)
{
cnt++; // 匹配则计数+1
}
}
}
// 3. 统计中奖等级(7-cnt 对应索引)
if (cnt >= 1 && cnt <= 7)
{
c[7 - cnt]++;
}
}
// 4. 输出结果(7个等级的统计数)
for (int i = 0; i < 7; i++)
{
cout << c[i] << " ";
}
cout << endl;
return 0;
}

以上就是这篇博客的全部内容,下一篇我们将继续探索C++算法的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
| 非常感谢您的阅读,喜欢的话记得三连哦 |

更多推荐


所有评论(0)