持续创作,加速成长!这是我参与「掘金日新计划 · 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 右下篮框中的蛋糕数
简单画一下草稿可以发现蛋糕的摆放规律如下所示。
#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);
}
}