题面
问题描述
BMP 是英文 Bitmap(位图)的简写,它是 Windows 操作系统中的标准图像文件格式,能够 被多种 Windows 应用程序所支持。 BMP 文件中包含位图文件头、位图信息头、彩色表和图 像数据四个部分。
本题模拟 BMP 文件格式,认为一个图像由一个结构体变量构成。
其中该 结构体类型包含图像的宽度、高度和图像数据(二维数组)。
请根据输入的旋转角度(0°/90° /180°/270°)对图像进行顺时针旋转后输出。
举例:
原位图的图像数据为 a[4][3],即宽为 3,高为 4
输入 0 度,输出图像数据为 out[4][3]格式,直接输出原图像 输入 90 度,输出图像数据为 out[3][4]格式,根据原始图像数据进行 90 度翻转;
输入 180 度,输出图像数据为 out[4][3]格式,根据原始图像数据进行 180 度翻转;
输入 270 度,输出图像数据为 out[3][4]格式,根据原始图像数据进行 270 度翻转
输入格式
输入图像宽 w 和高 h
输入 h 行 w 列的图像数据
输入旋转度数
输出格式
输出图像宽和高 输出旋转后图像。
样例输入
4 3 1 0 0 1 1 1 1 1 0 0 0 1 90
样例输出
3 4 0 1 1 0 1 0 0 1 0 1 1 1
样例说明
评测用例规模与约定 图像的宽高均不超过 10,结构体中图像的二维数组为 Image[10][10]。
题解
这题没必要用结构体
思路:
直接用行列指针控位(微操)输出数组,实现伪翻转
本思路最大难点在于行和列关系:
什么时候原来的行或列在外面一重循环 ,什么时候应该正序输出,什么时候倒序。
需要自己模拟弄清(或者照着代码试着理解)
#include <iostream>
using namespace std;
int a[15][15], angle, w, h;
int main()
{
cin >> w >> h;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
cin >> a[i][j];
}
}
cin >> angle;
switch (angle)
{
case 0:
cout << w << ' ' << h << '\n';
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
cout << a[i][j] << ' ';
}
cout << '\n';
}
break;
case 90:
cout << h << ' ' << w << '\n';
for (int j = 1; j <= w; j++)
{
for (int i = h; i >= 1; i--)
{
cout << a[i][j] << ' ';
}
cout << '\n';
}
break;
case 180:
cout << w << ' ' << h << '\n';
for (int i = h; i >= 1; i--)
{
for (int j = w; j >= 1; j--)
{
cout << a[i][j] << ' ';
}
cout << '\n';
}
break;
case 270:
cout << h << ' ' << w << '\n';
for (int j = w; j >= 1; j--)
{
for (int i = 1; i <= h ; i++)
{
cout << a[i][j] << ' ';
}
cout << '\n';
}
break;
default:
break;
}
return 0;
}
date:20231230