二维数组专题讲义
编程训练营 巧若拙
例题1: Name: 08_矩阵加法
描述:输入两个n行m列的矩阵A和B,输出它们的和A+B。
输入: 第一行包含两个整数n和m,表示矩阵的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。
接下来n行,每行m个整数,表示矩阵B的元素。
相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。
输出:n行,每行m个整数,表示矩阵加法的结果。相邻两个整数之间用单个空格隔开。
样例输入
3 3
1 2 3
1 2 3
1 2 3
1 2 3
4 5 6
7 8 9
样例输出
2 4 6
5 7 9
8 10 12
#include <iostream>
using namespace std;
const int M = 100;
const int N = 100;
int A[N][M], B[N][M], C[N][M];
int main()
{
int m, n, k;
cin >> n >> m;
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cin >> A[i][j];
}
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cin >> B[i][j];
}
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
C[i][j] = //语句1
}
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
cout << C[i][j] << " ";
}
cout << endl;
}
return 0;
}
问题1:将语句1补充完整。
参考答案:
问题1:语句1:C[i][j] = A[i][j] + B[i][j];
同步训练:Name: 10_矩阵转置
描述:输入一个n行m列的矩阵A,输出它的转置AT。
输入:第一行包含两个整数n和m,表示矩阵A的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。
输出:m行,每行n个整数,为矩阵A的转置。相邻两个整数之间用单个空格隔开。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7
2 5 8
3 6 9
例题2:Name: 14_扫雷游戏地雷数计算
描述:扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。(每个格子周围格有八个)
输入:第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出:n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
样例输入
3 3
*??
???
?*?
样例输出
*10
221
1*1
#include <iostream>
using namespace std;
const int M = 100;
const int N = 100;
char A[N][M];
int X[8] = {-1,-1,-1,0,1,1,1,0};//行坐标变化,从西北角开始
int Y[8] = {-1,0,1,1,1,0,-1,-1};//列坐标变化,从西北角开始
int main()
{
int n, m, s, r, c;
cin >> n >> m;
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cin >> A[i][j];
}
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
if (A[i][j] == '*')
cout << '*';
else
{
s = 0;
for (int k=0; k<8; k++)//累计周围地雷数量
{
r = i+X[k]; c = j+Y[k];
s += //语句1
}
cout << s;
}
}
cout << endl;
}
return 0;
}
问题1:将语句1补充完整。
参考答案:
问题1:语句1:s += (r>=0 && r<n && c>=0 && c<m && A[r][c]=='*');
同步训练:Name: 13_图像模糊处理
描述:给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1. 四周最外侧的像素点灰度值不变;
2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
输入:第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。
输出:n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
样例输入
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
样例输出
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
例题3:Name: 23_二维数组回形遍历
描述:给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:
输入:输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出:按遍历顺序输出每个整数。每个整数占一行。
样例输入
4 4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
样例输出(为节省纸张,打在了同一行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <iostream>
using namespace std;
const int M = 100;
const int N = 100;
int A[N][M];
int main()
{
intn, m;
cin>> n >> m;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
cin>> A[i][j];
}
intleft=-1,right=m-1,top=0,bottom=n-1;//分别代表左右上下边界
while(left<=right && top<=bottom)
{
for(int j=++left; j<=right; j++)//向右
cout<< A[top][j] << endl;
if( ) //语句1
{
for(int i=++top; i<=bottom; i++)//向下
cout<< A[i][right] << endl;
}
if( ) //语句2
{
for(int j=--right; j>=left; j--)//向左
cout<< A[bottom][j] << endl;
}
if( ) //语句3
{
for(int i=--bottom; i>=top; i--)//向上
cout<< A[i][left] << endl;
}
}
return0;
}
问题1:将语句1,语句2和语句3补充完整。
参考答案:
问题1:语句1:if (left<=right) 语句2:if (top<=bottom) 语句3:if (left<=right)
同步训练:Name: 22_神奇的幻方
描述:幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入:一个数字N(N<=20)
输出:按上方法构造的2N-1 * 2N-1的幻方
样例输入
3
样例输出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
课后练习:
练习1:Name: 09_矩阵乘法
描述:计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j](C[i][j]表示C矩阵中第i行第j列元素)。
输入:第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出:输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。
样例输入
3 2 3
1 1
1 1
1 1
1 1 1
1 1 1
样例输出
2 2 2
2 2 2
2 2 2
练习2:Name: 12_变幻的矩阵
描述:有一个N x N(N为奇数,且1 <= N <= 10)的矩阵,矩阵中的元素都是字符。这个矩阵可能会按照如下的几种变幻法则之一进行变幻(只会变幻一次)。
现在给出一个原始的矩阵,和一个变幻后的矩阵,请编写一个程序,来判定原始矩阵是按照哪一种法则变幻为目标矩阵的。
1. 按照顺时针方向旋转90度;
如:
1 2 3 7 4 1
4 5 6 变幻为 8 5 2
7 8 9 9 6 3
2. 按照逆时针方向旋转90度;
如:
1 2 3 3 6 9
4 5 6 变幻为 2 5 8
7 8 9 1 4 7
3. 中央元素不变(如下例中的 5),其他元素(如下例中的3)与“以中央元素为中心的对应元素”(如下例中的7)互换;
如:
1 2 3 9 8 7
4 5 6 变幻为6 5 4
7 8 9 3 2 1
4. 保持原始矩阵,不变幻;
5. 如果 从原始矩阵 到 目标矩阵 的变幻,不符合任何上述变幻,请输出5
输入:第一行:矩阵每行/列元素的个数 N;
第二行到第N+1行:原始矩阵,共N行,每行N个字符;
第N+2行到第2*N+1行:目标矩阵,共N行,每行N个字符;
输出:只有一行,从原始矩阵 到 目标矩阵 的所采取的 变幻法则的编号。
样例输入
5
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
y x w v u
t s r q p
o n m l k
j i h g f
e d c b a
样例输出:
3
练习3:Name: 15_细菌的繁殖与扩散
描述:在边长为9的正方形培养皿中,正中心位置有m个细菌。假设细菌的寿命仅一天,但每天可繁殖10个后代,而且这10个后代,有两个分布在原来的单元格中,其余的均匀分布在其四周相邻的八个单元格中。求经过n(1≤n≤4)天后,细菌在培养皿中的分布情况。
输入:输入为两个整数,第一个整数m表示中心位置细菌的个数(2 ≤ m ≤ 30),第二个整数n表示经过的天数(1 ≤ n ≤ 4)。
输出:输出九行九列整数矩阵,每行的整数之间用空格分隔。整个矩阵代表n天后细菌在培养皿上的分布情况。
样例输入
2 1
样例输出
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 2 4 2 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
练习4:Name: 16_矩阵剪刀石头布
描述 :Bart的妹妹Lisa在一个二维矩阵上创造了新的文明。矩阵上每个位置被三种生命形式之一占据:石头,剪刀,布。
每天,上下左右相邻的不同生命形式将会发生战斗。在战斗中,石头永远胜剪刀,剪刀永远胜布,布永远胜石头。
每一天结束之后,败者的领地将被胜者占领。
你的工作是计算出n天之后矩阵的占据情况。
输入 :第一行包含三个正整数r,c,n,分别表示矩阵的行数、列数以及天数。每个整数均不超过100。
接下来r行,每行c个字符,描述矩阵初始时被占据的情况。每个位置上的字符只能是R,S,P三者之一,分别代表石头,剪刀,布。
相邻字符之间无空格。
输出 :输出n天之后的矩阵占据情况。每个位置上的字符只能是R,S,P三者之一,相邻字符之间无空格。
样例输入
3 3 1
RRR
RSR
RRR
样例输出
RRR
RRR
RRR
练习5: Name: 21_二维数组右上左下遍历
描述:给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
输入:输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出:按遍历顺序输出每个整数。每个整数占一行。
样例输入
3 4
1 2 4 7
3 5 8 10
6 9 11 12
样例输出(为节省纸张,打在了同一行)
1 2 3 4 5 6 7 8 9 10 11 12
练习6;Name: 20_反反复复
描述 :Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列, 并在末尾补充一些随机字母使其成为一个完整的字母矩阵。
例如,若信息是“There's no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x
注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵, 当然他使用任何字母都是可以的。
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行…… 以此左右交替地从上到下写下各行字母,形成新的字符串。
这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。
你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
输入 :第一行包含一个整数(范围2到20),表示使用的列数。
第二行是一个长度不超过200的字符串。
输出 :一行,即原始信息。
样例输入
5
toioynnkpheleaigshareconhtomesnlewx
样例输出
theresnoplacelikehomeonasnowynightx
二维数组专题讲义
最新推荐文章于 2023-12-07 21:48:46 发布