1.6数组-像素翻转

题目描述

有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。

测试样例:
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]


解法:我的想法是先将行列进行互换,再将两列进行互换,最后得到旋转后的矩阵。
1.vector作为二维数组的新用法
2.用swamp函数进行互换也可
#include <iostream>
#include<string>
#include<vector>
using namespace std;

void printMat(vector<vector<int> > mat, int n) {
	for(int i=0; i < n; i++) {  
	    for(int j = 0; j < n; j++) 
            cout << mat[i][j] << "   "; 
            cout << endl; 
    } 
}
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
        //90度翻转,先对角互换,再0与n-1之间的列互换即可
        //先对角互换 
		for(int i = 0; i < n; i++) {
			for(int j = i + 1; j < n; j++) {  //这里i和j相等的时候就不用互换了
			int temp;
			temp = mat[i][j] ;
			mat[i][j] = mat[j][i];
			mat[j][i] = temp;
			}
		}
		//列向量互换
		for(int j = 0; j < n /2; j++ )
		for(int i = 0; i < n; i++) {
			int temp = mat[i][j];
			mat[i][j] = mat[i][n-j-1];
			mat[i][n-j-1] = temp;
		} 		
    printMat(mat, n);
    return mat;
}
int main(int argc, char** argv) {
	int n = 5;
vector<vector<int> > array(n); //3个向量 
    for(int i = 0; i < n; i++) {
		array[i].resize(n);//设置数组的大小3X3
		}               
 for(int i = 0; i < n; i++) {
 	for(int j = 0; j < n; j++) {
	 	array[i][j] = (n * i + 1 + j);	 	
	   }
	}
	  //输出 
	cout << "原始图像:" << endl;
	printMat(array, n);  
    cout << "90度旋转后的数组:" << endl;
	transformImage(array, n);
    return 0;  
}

  

posted @ 2016-02-02 16:00  梦幻之海  阅读(203)  评论(0编辑  收藏  举报