【CCF】图像旋转

试题名称: 图像旋转 
时间限制: 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();
		}
		
	}
}


经过CCF网站提交对比是这样的:

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代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值