试题名称: 图像旋转
时间限制: 5.0s
内存限制: 256.0MB
问题描述: 问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。
接下来n行每行包含m个整数,表示输入的图像。
输出格式
输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3
1 5 3
3 2 4
样例输出
3 4
5 2
1 3
评测用例规模与约定
时间限制: 5.0s
内存限制: 256.0MB
问题描述: 问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。
接下来n行每行包含m个整数,表示输入的图像。
输出格式
输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3
1 5 3
3 2 4
样例输出
3 4
5 2
1 3
评测用例规模与约定
1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。
memset(matrix,0,sum*sizeof(matrix);在CCF提交的时候出现编译错误。但是VC6.0和VS2010都没有出现编译错误。删掉即可提交通过。
花了挺长时间,主要是坐标的映射需要刚好到位,大部分时间在调整数字。
① 自己编的C++法
#include<iostream>
using namespace std;
int main(){
int m,n,sum,i,num,x=0;
cin>>n>>m;
//如果行数是偶数且 宽+行 为偶数,列数是奇数且 宽+行 为奇数
//这种情况发生旋转无法让左上角的坐标为(0,0)而是(1,0),会空出一行
//所以旋转后需要将图像向上挪一行
if(((n%2==0)&&(n+m)%2==0) || (n%2!=0 && (n+m)%2!=0))
{
x = -1;
}
sum=m*n;
int* matrix = new int[sum];
for(i=-1;++i<sum;){
cin>>num;
// cout<<(n/2-i%m +m/2) * n + (i/m - m/2 + n/2)<<endl;
//[y][x]
// cout<<i%m<<" ";//x
// cout<<i/m<<endl;//y
//y行减去1/2高n、x列减去1/2宽m
// cout<<i%m - m/2<<" ";//x
// cout<<i/m - n/2<<endl;//y
//旋转
// cout<<i/m - n/2<<" ";//x = y;
// cout<<m/2-i%m <<endl;//y = -x;
//加回减去的高和宽
// cout<<i/m - n/2 + n/2<<" ";//x m
// cout<<m/2-i%m + m/2+x<<endl;//y n
// cout<<endl;
//通过行y和列x计算出一维数组下标
// cout<<(m/2-i%m + m/2 + x) * n + i/m<<endl;
// cout<<endl;
matrix[(m/2-i%m + m/2 + x) * n + i/m]=num;
}
for(i=-1;++i<sum;){
cout<<matrix[i];
if((i+1) % n == 0){
cout<<endl;
}
else{
cout<<" ";
}
}
delete[]matrix;
return 0;
}
② 在网上找的Java法:http://www.bubuko.com/infodetail-1041229.html
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().run();
}
public void run(){
Scanner sc=new Scanner(System.in);
int M= sc.nextInt();
int N=sc.nextInt();
//int[][] arr=new int[M][N];
int[][] arr=new int[N][M];
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
arr[N-j-1][i]=sc.nextInt();
}
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
54270是不带delete[]matrix的
55322是带delete[]matrix的
55340是把
if((i+1) % n == 0){
cout<<endl;
}
else{
cout<<" ";
}
改成
if((i+1) % n != 0){
cout<<" ";
}
else{
cout<<endl;
}
的
55351是Java代码