图像的翻转旋转 【问题描述】给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度; B:逆时针旋转90度; C:左右翻转; D:上下翻转。 【输入】 第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m="">=><= 100,="" 1="">=><= n="">=><=>=> 【输出】 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 #include 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 <> a[i][j] = b[i][j]; } } } //定义顺时针翻转函数 void clockwise() { for(int i = 0; i < m;="" i++)=""> for(int j = 0;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 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 <> 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; } |
|