刷题分享 ”矩阵交换“、”不要二“

124 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

1、原题概述

输入描述: 第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10) 从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。 接下来一行输入k,表示要执行k次操作(1≤k≤5)。接下来有k行,每行包括一个字符t和两个数a和b,中间用空格格分隔,t代表需要执行的操作,当t为字符'r'时代表进行行变换,当t为字符'c'时代表进行列变换,a和b为需要互换的行或列(1≤a≤b≤n≤10,1≤a≤b≤m≤10)。 提示:当t为别的字符时不需要处理

输出描述:输出n行m列,为矩阵交换后的结果。每个数后面有一个空格。例:

输入:

2 2
1 2
3 4
1
r 1 2

输出:

3 4 
1 2 

思路

由题意得,我们是对一个数组进行反复的行与行的互换或列与列互换,所以我们可以写两个函数去完成这两事情:

行行互换

void fun(int n, int m, int a, int b, int arr[][10]) {
//参数列表 数组的大小 n*m、要交换的两行a、b,以及一个数组。
    int temp[10];
    for (int i = 0; i < n; i++) {
        temp[i] = arr[i][a - 1];
        arr[i][a - 1] = arr[i][b - 1];
        arr[i][b - 1] = temp[i];
    }
}

列列互换

void fun1(int n, int m, int a, int b, int arr[][10]) {
//参数列表 数组的大小 n*m、要交换的两行a、b,以及一个数组。
    int temp[10];
    for (int i = 0; i < m; i++) {
        temp[i] = arr[a - 1][i];
        arr[a - 1][i] = arr[b - 1][i];
        arr[b - 1][i] = temp[i];
    }
}

开始交换

 for (i = 0; i < k; i++) {
        scanf("%c%d%d", &t, &a, &b);//传入三个参数
        getchar();//吸收enter
        if (t == 'c') {//行变换
            fun(n, m, a, b, arr);
        }
        if (t == 'r') {//列变换
            fun1(n, m, a, b, arr);
        }
    }

最后for循环打印即可

2、不要二 原题概述

二货小易有一个W*H的网格盒子,网格的行编号为 0 -> H-1,网格的列编号为 0 -> W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。

输入描述:

每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

输出描述:

输出一个最多可以放的蛋糕数

思路

这大抵是一个数学题,就好比编程求1~100的和,你可以使用for循环一个一个加,也可以直接套等差数列的公式。 这题我用的就是后者的思维。

** 盘子为a*b大小**

8*(a/4)*(b/4)黄色框中的数量

(2j(b/4))+(2i(a/4))两个侧边绿色蛋糕的数量

k 右下篮框中的蛋糕数 简单画一下草稿可以发现蛋糕的摆放规律如下所示。 image.png

#include <iostream>
using namespace std;
int main() {
    int a, b;
    while (cin >> a >> b) {
        int num=0,j=0,i=0,k=0;
        j=a%4;
        i=b%4;
        for(int d=0;d<i;d++){
            for(int s=0;s<j;s++){
                if((s==d)||(s+d==1)||(s+d==5))
                    k++;
            }
        }
       
        num=8*(a/4)*(b/4)+(2*j*(b/4))+(2*i*(a/4))+k;
        printf("%d",num);
    }
}