数组与字符串 1.6

给定一幅NXN矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将图像旋转90度。不占用额外内存空间能否做到?

分析:此处假设对图像做顺时针旋转。对于image[i][j],其顺时针旋转角度与对应点坐标分别为:90度--image[j][n-i-1], 180度--image[n-i][n-j], 270度--image[n-j][i]。赋值流程为:tmp <-- image[i][j] <-- image[n-i-1][j] <-- image[n-i-1][n-j-1] <-- image[i][n-j-1] <-- tmp。

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstring>
 4 #include <vector>
 5 #include <assert.h>
 6 
 7 using namespace std;
 8 
 9 void rotate( vector<vector<unsigned int> >& image );
10 
11 int main( int argc, char *argv[] ) {
12     string data_file = "./1.6.txt";
13     ifstream ifile( data_file.c_str(), ios::in );
14     if( !ifile.is_open() ) {
15         fprintf( stderr, "cannot open file: %s
", data_file.c_str() );
16         return -1;
17     }
18     int n = 0;
19     while( ifile >>n ) {
20         vector<vector<unsigned int> > image( n, vector<unsigned int>( n, 0 ) );
21         assert( n > 0 );
22         cout <<"input:" <<endl;
23         for( int i = 0; i < n; ++i ) {
24             for( int j = 0; j < n; ++j ) {
25                 ifile >>image[i][j];
26                 cout <<image[i][j] <<" ";
27             }
28             cout <<endl;
29         }
30         rotate( image );
31         cout <<"result:" <<endl;
32         for( int i = 0; i < n; ++i ) {
33             for( int j = 0; j < n; ++j ) {
34                 cout <<image[i][j] <<" ";
35             }
36             cout <<endl;
37         }
38         cout <<endl;
39     }
40     ifile.close();
41     return 0;
42 }
43 
44 void rotate( vector<vector<unsigned int> >& image ) {
45     int n = image.size();
46     if( --n <= 0 ) { return; }
47     for( int i = 0; i <= n/2; ++i ) {
48         for( int j = i; j < n-i; ++j ) {
49             unsigned int tmp = image[i][j];
50             image[i][j] = image[n-j][i];
51             image[n-j][i] = image[n-i][n-j];
52             image[n-i][n-j] = image[j][n-i];
53             image[j][n-i] = tmp;
54         }
55     }
56     return;
57 }

测试文件

1
1

2
1 2
3 4

3
1 2 3
4 5 6
7 8 9

4
1 2 3 4
4 5 6 7
9 10 11 12
13 14 15 16

5
232 123 243 231 211
654 123 123 134 876
142 562 475 987 321
235 635 478 693 146
111 222 323 454 656