题目
BUPT 2014 计算机 ProblemB(oj)
在图形学中,我们经常需要对具体的图像进行一-些处理。在这个问题中,你的任务是将一幅只包含01像素点的图片进行顺时针旋转。旋转的角度仅包含0度,90度,180度和270度。
用时:45min
输入描述
输入的第行是一个整数T (T≤50),表示输入的数据组数。
每组测试数据的第一.行是两个整数N和M(1≤N,M≤50),表示图片的高度和宽度。
接下来N行,每行是一个长度为M的01串,表示图片的像素点。最后一行是一个整数angle,表示旋转的角度。
输出描述
对于每组测试数据,输出旋转后得到的图片。请注意不要输出多余的空格或空行。
示例
输入
2
2 3
111
000
90
3 3
111
101
111
180
输出
01
01
01
111
101
111
题解
#include <bits/stdc++.h>
#define M 100005
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=1; i<=t; i++)
{
int m,n,angle;
cin>>n>>m;
int a[55][55],b[55][55];
string row;
for(int j=0; j<n; j++)
{
cin>>row;
for(int k=0; k<m; k++)
a[j][k]=row[k]-'0';
}
cin>>angle;
if(angle==0)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
b[j][k]=a[j][k];
}
}
else if(angle==90)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
b[k][n-1-j]=a[j][k];
}
}
swap(n,m);
}
else if(angle==180)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
b[n-1-j][m-1-k]=a[j][k];
}
}
}
else
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
b[m-1-k][j]=a[j][k];
}
}
swap(n,m);
}
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
cout<<b[j][k];
}
cout<<endl;
}
}
}
改进
更好的办法是:写一个旋转90度的函数,根据总共旋转的度数每次调用函数。比如:旋转270度就调用三次旋转90度的函数
#include <bits/stdc++.h>
#define M 100005
using namespace std;
//旋转90
void rot(int n,int m,int angle,int a[55][55])
{
if(angle==0)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
cout<<a[j][k];
}
cout<<endl;
}
return;
}
int b[55][55];
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
{
b[k][n-1-j]=a[j][k];
}
}
rot(m,n,angle-90,b);
}
int main()
{
int t;
cin>>t;
for(int i=1; i<=t; i++)
{
int m,n,angle;
cin>>n>>m;
int a[55][55],b[55][55];
string row;
for(int j=0; j<n; j++)
{
cin>>row;
for(int k=0; k<m; k++)
a[j][k]=row[k]-'0';
}
cin>>angle;
rot(n,m,angle,a);
}
}