时间限制: 内存限制:
题目描述
手机的图片编辑有水平翻转、垂直翻转功能,这些很快就有了思路,然而旋转功能让我很费了番脑筋:
旋转360度就绕回来了,所以只需考虑整除360后的余数。
规定左旋为正,右旋为负。那么右旋X度(X < 0)等于左旋(360+X)度,实现了左旋也能解决右旋。
斜着转出半个像素绝对要疯,咱只考虑以90度为单位的旋转,那么还剩左旋90、180、270三种情况。
左旋180、270度显然可以通过连续两次、三次的左旋90度实现。于是只需搞定左旋90度即可。
说到图像(image):
图像由很多称为像素pixel的小点构成,排成矩形点阵,用二维数组保存就行。
每个像素由红Red、绿Green、蓝Blue、透明度Alpha四种分量构成,各8-bit,可用uint32_t保存。
先导题目:字节解析、字节序。
输入格式
数据有多组输入,处理到EOF为止。每组输入的内容是:
首先读入两个正整数:图片像素点阵的行数R、列数C。于是图片共R * C个像素。
接下来有R行、每行C个像素值。像素格式为ABGR32,即AABBGGRR,共8位十六进制数,红色在最低字节。像素间由空格隔开。
图像宽、高都不超过1024。
输出格式
对各组输入,输出左旋90度后结果:
新行数 新列数
逐行按ABGR32格式输出像素数据,十六进制数字如是字母要大写。像素间由空格隔开。
输入样例
1 1
01020304
2 3
0A0B0C00 0A0B0C01 0A0B0C02
0A0B0C03 0A0B0C04 0A0B0C05
输出样例
1 1
01020304
3 2
0A0B0C02 0A0B0C05
0A0B0C01 0A0B0C04
0A0B0C00 0A0B0C03
样例解释
数据1:1行1列的图像左旋90度。
数据2:2行3列的图像左旋90度变为3行2列。
个人思路
- 看到“可用uint32_t保存。”和“16”进制的时候下意识认为可能会很容易出现段错误的情况,然后就试了下用string类型的二维数组来存,然后果不其然,第一个测试点一直段错误
- 更改为uint32_t 然后用十六进制来保存后问题依然没有解决
- 试了下下方的动态数组的形式测试点突然通过了,原来原因在于直接定义二维数组而没有进行内存空间的动态分配与释放最终导致的段错误
#include<bits/stdc++.h>
using namespace std;
int main()
{
int r,c;
while(cin>>r>>c)
{
vector<vector<string>> vv;
for(int i=0;i<r;i++)
{
vector<string> v;
for(int j=0;j<c;j++)
{
string strt;
cin>>strt;
v.push_back(strt);
}
vv.push_back(v);
}
cout<<c<<" "<<r<<endl;
for(int j=c-1;j>=0;j--)
{
for(int i=0;i<r;i++)
{
if(i!=r-1)
cout<<vv[i][j]<<" ";
else
cout<<vv[i][j]<<endl;
}
}
}
}