友情提示:380元/半年,儿童学编程,就上码丁实验室。
图像的翻转旋转
【问题描述】给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。
其中,可能的操作及对应字符有如下四种:
A:顺时针旋转90度;
B:逆时针旋转90度;
C:左右翻转;
D:上下翻转。
【输入】
第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值范围在0到255之间。
接下来一行,包含由A、B、C、D组成的字符串s,表示需要按顺序执行的操作序列。s的长度在1到100之间。
【输出】
m’行,每行包含n’个整数,为最终图像各像素点的灰度值。其中m’为最终图像的行数,n’为最终图像的列数。相邻两个整数之间用单个空格隔开。
样例输入
2 3
10 0 10
100 100 10
AC
样例输出
10 100
0 100
10 10
问题解析:
1) 例如原始数组为a数组,变换后存入b数组当中,分析每种变换之后的坐标有什么特点以及行和列有什么变化:
顺时针翻转:b[j][m-1-i]= a[i][j]; b数组的行数是a数组的列数,b数组的列数是a数组的行数;
逆时针翻转:b[n-1-j][i]= a[i][j]; b数组的行数是a数组的列数,b数组的列数是a数组的行数;
左右翻转:b[i][n-1-j]= a[i][j]; 行和列均不变;
上下翻转:b[m-1-i][j]= a[i][j]; 行和列均不变;
使用自定义函数单独处理四种翻转变换;
2) 输入一个二维数组a,输入一个字符串s,遍历字符串,判断每个字符,如果是A,则调用顺时针翻转函数,如果是B,则调用逆时针翻转函数,如果是C,则调用左右翻转函数,如果是D,则调用上下翻转函数;
3) 最后将变换后的图形输出。
完整代码参考:
#include <iostream>
#include <string>
using namespace std;
int a[100][100]={};
int b[100][100]={};
int m,n;
//定义复制数组函数
void copyab(){
for(int i = 0; i < m; i++) {
for(int j = 0;j < n;j++){
a[i][j] = b[i][j];
}
}
}
//定义顺时针翻转函数
void clockwise() {
for(int i = 0; i < m; i++) {
for(int j = 0;j < n;j++){
b[j][m-1-i]=a[i][j];
}
}
int t = m;
m = n;
n = t;
copyab();
}
//定义逆时针翻转函数
void anticlockwise() {
for(int i = 0; i < m; i++) {
for(int j= 0; j <n; j++) {
b[n-1-j][i]=a[i][j];
}
}
int t = m;
m = n;
n = t;
copyab();
}
//定义左右翻转函数
void flip() {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
b[i][n-1-j]=a[i][j];
}
}
copyab();
}
//定义上下翻转函数
void upside_down() {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
b[m-1-i][j]=a[i][j];
}
}
copyab();
}
int main() {
//1.输入二维数组
cin >>m >>n;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >>a[i][j];
}
}
//2.输入字符串并判断每个字符调用对应的函数
string s;
cin>>s;
for(int i = 0;i < s.length();i++){
if(s[i] == ‘A’){
clockwise();
}else if(s[i] == ‘B’){
anticlockwise();
}else if(s[i] == ‘C’){
flip();
}else if(s[i] == ‘D’){
upside_down();
}
}
//3.输出变换后的二维数组
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cout << a[i][j] << ” “;
}
cout << endl;
}
return 0;
}
转自公众号:
noip案例讲解