C语言程序设计基础|方阵

题目一:求矩阵每列的最大值与和

题目描述:

定义一个二维数组(不超过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;
}

你可能感兴趣的:(Simple,C,c语言,c++,算法)