2041:【例5.9】新矩阵
【题目描述】
已知一个n×n(2≤n≤20)(的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int a[21][21];
int main() {
//input data
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (i == j) a[i][j] += 10;
if (i + j == n + 1) a[i][j] += 10;
}
}
if (n % 2 == 1)a[(n + 1) / 2][(n + 1) / 2] -= 10;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
2041:【例5.9】新矩阵
【题目描述】
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int m, n;
cin >> m >> n;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int x;
cin >> x;
if (x != 0)
cout << i << " " << j << " " << x << endl;
}
}
return 0;
}
2043:【例5.11】杨辉三角形
【题目描述】
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int a[21][21];
int main() {
//input data
int n;
cin >> n;
for (int i = 1; i <= n; i++) {//初始化1
a[i][1] = a[i][i] = 1;
}
for (int i = 3; i <= n; i++) {
for (int j = 2; j <= i - 1; j++) {
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
2044:【例5.12】回文字串
【题目描述】
输入一串字符,字符个数不超过100,且以“
.
”结束。 判断它们是否构成回文。
【题目分析】
整体考虑:
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
char c, cnt = 0;
char a[105] = {};
char b[105] = {};
while (cin >> c, c != '.') {
a[cnt++] = c;
}
for (int i = 0; i < cnt; i++) {
b[i] = a[cnt - i - 1];
}
if (strcmp(a, b) == 0) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
局部比较:
#include <bits/stdc++.h>
using namespace std;
char a[105];
int main() {
//input data
char c, cnt = 0;
while (cin >> c, c != '.') {
a[++cnt] = c;
}
int left = 1, right = cnt;
while (a[left] == a[right] && left < right) {
left++, right--;
}
if (left < right) cout << "No";
else cout << "Yes";
return 0;
}
2045:【例5.13】蛇形填数
【题目描述】
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int a[21][21];
int i, j, cnt = 0;
int k = 0;
int main() {
//input data
int n;
cin >> n;
i = 1, j = n;
while (k < n / 2) {
while (i < n - k) {
a[i][j] = ++cnt;
i++;
}
while ( j > 1 + k) {
a[i][j] = ++cnt;
j--;
}
while (i > 1 + k) {
a[i][j] = ++cnt;
i--;
}
while ( j < n - k ) {
a[i][j] = ++cnt;
j++;
}
j--, i++, k++;
}
if (n % 2 == 1) a[(n + 1) / 2][(n + 1) / 2] = n * n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
1119:矩阵交换行
【题目描述】
给定一个5×5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int k = 5, a[6][6] = {};
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k; j++) {
cin >> a[i][j];
}
}
int m, n;
cin >> m >> n;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k; j++) {
if (i == m) cout << a[n][j] << " ";
else if (i == n) cout << a[m][j] << " ";
else cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
1120:同行列对角线的格
【题目描述】
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, x, y;
cin >> n >> x >> y;
for (int i = 1; i <= n; i++) {
printf("(%d,%d) ", x, i);
}
cout << endl;
for (int i = 1; i <= n; i++) {
printf("(%d,%d) ", i, y);
}
cout << endl;
for (int i = 1; i <= n; i++) {
int j = i - x + y; //i-j=x-y
if (j >= 1 && j <= n)
printf("(%d,%d) ", i, j);
}
cout << endl;
for (int i = n; i >= 1; i--) {
int j = x + y - i; //i+j=x+y
if (j >= 1 && j <= n)
printf("(%d,%d) ", i, j);
}
return 0;
}
1121:计算矩阵边缘元素之和
【题目描述】
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int m, n;
cin >> m >> n;
int sum = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int x;
cin >> x;
if (i == 1 || j == 1 || i == m || j == n)
sum += x;
}
}
cout << sum;
return 0;
}
1122:计算鞍点
【题目描述】
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int k = 5, a[6][6] = {};
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k; j++) {
cin >> a[i][j];
}
}
int j = 0, flag = 0;
for (int i = 1; i <= k; i++) {
int maxn = -1, maxi = 0;
for (j = 1; j <= k; j++) {
if (a[i][j] > maxn) {
maxn = a[i][j];
maxi = j;
}
}
j = 1;
for (j = 1; j <= k; j++) {
if (maxn > a[j][maxi]) break;
}
if (j > k) {
cout << i << " " << maxi << " " << maxn << endl;
flag = 1;
}
}
if (flag == 0) cout << "not found";
return 0;
}
1123:图像相似度
【题目描述】
给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m, sum = 0;
bool a[105][105] = {};
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int x;
cin >> x;
if (a[i][j] == x) sum++;
}
}
printf("%.2f", sum * 1.0 / (m * n) * 100);
return 0;
}
1124:矩阵加法
【题目描述】
输入两个n行m列的矩阵A和B,输出它们的和A+B。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m, a[105][105] = {};
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int x;
cin >> x;
a[i][j] += x;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
1125:矩阵乘法
【题目描述】
计算两个矩阵的乘法。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列元素)。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m, k;
cin >> n >> m >> k;
int a[105][105] = {}, b[105][105] = {};
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= k; j++) {
cin >> b[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int sum = 0;
for (int k = 1; k <= m; k++) {
sum += a[i][k] * b[k][j];
}
cout << sum << " ";
}
cout << endl;
}
return 0;
}
1126:矩阵转置
【题目描述】
输入一个n行m列的矩阵A,输出它的转置AT。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m;
int a[105][105];
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cout << a[j][i] << " ";
}
cout << endl;
}
return 0;
}
1127:图像旋转
【题目描述】
输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m;
int a[105][105];
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++) {
for (int j = n; j >= 1; j--) {
cout << a[j][i] << " ";
}
cout << endl;
}
return 0;
}
1128:图像模糊处理
【题目描述】
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1.四周最外侧的像素点灰度值不变;
2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
【题目分析】
#include <bits/stdc++.h>
using namespace std;
int main() {
//input data
int n, m;
int a[105][105] = {}, b[105][105] = {};
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
b[i][j] = a[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (i == 1 || i == n || j == 1 || j == m)
cout << a[i][j] << " ";
else
cout << floor((a[i][j] + a[i - 1][j] + a[i + 1][j] + a[i][j - 1] + a[i][j + 1]) / 5.0 + 0.5) << " ";
}
cout << endl;
}
return 0;
}