题目一:求矩阵每列的最大值与和
题目描述:
定义一个二维数组(不超过10*10),输入方阵的大小n,然后输入数组的数据,求该矩阵每列的最大值与和
输出要求:
测试数据的组数t
第一个矩阵的大小n
第一个矩阵的元素
第二个矩阵的大小n
第二个矩阵的元素
......
输出要求:
第一个矩阵的每一列最大值、和
第二个矩阵的每一列最大值、和
#include
#include
#include
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int arr[10][10];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
int sum, max0;
for (int j = 0; j < n; j++)
{
sum = 0;
max0 = 0xc0c0c0c0;
for (int k = 0; k < n; k++)
{
max0 = max(max0, arr[k][j]);//找出每一列的最大值
sum += arr[k][j];//将每一列累加
}
cout << max0 << " " << sum << endl;
}
}
return 0;
}
题目二:n阶幻方矩阵验证
题目描述:
n阶幻方矩阵是指将1,2,3,...,n²数字填入n*n矩阵中,每行和,每列和,两条对角线的和均相等。给定n阶矩阵,验证是否n阶幻方矩阵。
输入要求:
测试次数t
每组测试数据为:矩阵大小n,后跟n*n的矩阵数据。
输出要求:
对每组测试数据,输出判定结果,YES或NO
#include
#include
#include
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int arr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
int sum = 0, cnt = 0;
for (int j = 0; j < n; j++)//以第一列的和为参考值,确定每行每列以及对角线的和是否相等
{
sum += arr[0][j];
}
for (int i = 0; i < n; i++)
{
int sumh = 0, suml = 0;
for (int j = 0; j < n; j++)
{
sumh += arr[i][j];//求每一行的和
suml += arr[j][i];//求每一列的和
}
if (sumh == sum)//如果相等,计数器+1
{
cnt++;
}
if (sumh == sum)//如果相等,计数器+1
{
cnt++;
}
}
int sumf = 0, sumz = 0;
for (int k = 0; k < n; k++)
{
sumz += arr[k][n - k - 1];//求主对角线的和
sumf += arr[n - k - 1][k];//求副对角线的和
}
if (sumz == sum)
{
cnt++;
}
if (sumf == sum)
{
cnt++;
}
if (cnt == 2 * n + 2)//如果计数器等于行数+列数+两条对角线即为幻方矩阵
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
题目三:神奇的幻方
题目描述:
幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行、每列及两条对角线上的数字之和都相同。当N为奇数时,我们可以通过以下方法构建一个幻方:
首先将1写在第一行的中间。之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N):
1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列;
2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行;3.若(K−1)在第一行最后一列,则将K填在(K−1)的正下方;
4.若(K−1)既不在第一行,也不在最后一列,如果(K−1)的右上方还未填数,则将K填在(K−1)的右上方,否则将K填在(K−1)的正下方。
现给定N请按上述方法构造N*N的幻方。
输入要求:
输入文件只有一行,包含一个整数N即幻方的大小。(N为奇数,小于30)
输出要求:
输出文件包含N行,每行N个整数,即按上述方法构造出的N*N的幻方。相邻两个整数之间用单个空格隔开。
#include
#include
#include
#include
#include
using namespace std;
int main() {
int n, i, j, oi, oj;
cin >> n;
int arr[n][n];
memset(arr, 0, n * n * sizeof(int));//将n阶方阵赋值为0
i = 0;//初始时为第一行
j = n / 2;//初始时为最中间一列
for (int k = 1; k <= n * n; k++)
{
arr[i][j] = k;
if (i == 0)//如果目前位置在第一行,则下个位置在最后一行
{
oi = n - 1;
}
else
{
oi = i - 1;//如果目前位置不在第一行,则下个位置在其上一行
}
if (j == n - 1)//如果目前位置在最后一列,则下个位置在第一列
{
oj = 0;
}
else//如果目前位置在最后一列,则下个位置在其右一列
{
oj = j + 1;
}
if (arr[oi][oj] == 0)//由填数规律可知副对角线一定是从左下向右上填
{
i = oi;
j = oj;
}
else//如果在第一行最后一列时,按照填数规则下一个数将填在最后一行第一列,但这个位置一定有数,因此i++,直接填在其下方
{
i++;
}
}
for (int x = 0; x < n; x++)
{
for (int y = 0; y < n; y++)
{
cout << arr[x][y] << " \n"[y == n - 1];
}
}
return 0;
}
题目四:矩阵操作
题目描述:
给定一个N阶初始矩阵,现有以下操作
TRANSLATE: 转置,即将aij变为aji,操作结束后输出矩阵,并将这一新矩阵储存至原二维数组中。
ADD: 将该矩阵与一矩阵相加得到一新矩阵,操作结束后输出这一新矩阵,并将这一新矩阵储存至原二维数组中。
MULTIPLY: 与该矩阵与一矩阵相乘得到一新矩阵,操作结束后输出这一新矩阵(此处不懂矩阵乘法请自行百度),并将这一新矩阵储存至原二维数组中。
SUM:输出两条对角线上元素之和(不重复计算)
输入要求:
测试数据只有一组
输入的第一行给出一个整数N(1 <= N <= 5),代表矩阵的阶数
下N行代表这一矩阵,其数值都是整数
其后的每一行都是操作,数据保证输入合法
操作以 OVER 结束
输出要求:
略
#include
#include
#include
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
int arr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
char ch[10];
char ch1[] = "TRANSLATE";//转置
char ch2[] = "ADD";//相加
char ch3[] = "MULTIPLY";//相乘
char ch4[] = "SUM";//求和
char ch0[] = "OVER";//结束
while (1)
{
cin >> ch;
if (strcmp(ch, ch1) == 0)//本题将arr转置后赋值给brr,再将brr重新赋值给arr,用swap会更简洁
{
int brr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
brr[i][j] = arr[j][i];
cout << brr[i][j] << " \n"[j == n - 1];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i][j] = brr[i][j];
}
}
}
if (strcmp(ch, ch2) == 0)//相加,思路简单
{
int crr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> crr[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i][j] = arr[i][j] + crr[i][j];
cout << arr[i][j] << " \n"[j == n - 1];
}
}
}
if (strcmp(ch, ch3) == 0)
{
int drr[n][n], err[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> drr[i][j];
err[i][j] = 0;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
err[i][j] += arr[i][k] * drr[k][j];//矩阵相乘的写法,利用三重循环
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i][j] = err[i][j];
cout << arr[i][j] << " \n"[j == n - 1];
}
}
}
if (strcmp(ch, ch4) == 0)
{
int main = 0, minor = 0;
for (int i = 0; i < n; i++)
{
main += arr[i][n - 1 - i];//主对角线元素之和
minor += arr[n - 1 - i][i];//副对角线元素之和
}
cout << main + minor << endl;
}
if (strcmp(ch, ch0) == 0)
{
break;
}
}
return 0;
}