码迷,mamicode.com
首页 > 其他好文 > 详细

InPlace Transition of a matrix

时间:2014-04-28 03:22:07      阅读:513      评论:0      收藏:0      [点我收藏+]

标签:com   class   blog   div   code   size   string   color   tab   get   ble   

Problem illustration:

given a n*n matrix, print its transition, for example , 90 degree clockwise,using only constant additional space

analysis:

using O(n^2) space is common,but for constant assistant space, we need to adopt constant space

solution:

use in place replacement, 

take

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

for example

the expected output is

21 16 11 6 1
22 17 12 7 2
23 18 13 8 3
24 19 14 9 4
25 20 15 10 5

after transition,value (0,0) is expected to be transferred to pos(0,4),while(0,4)→(4,4),(4,4) to (4,0),(4,0)to (0,0),which is the same with our 

so this four elements are called a cycle(for more clear explanation, please refer to situ permutation)

 

two keypoints:

1.with the same example,since we use (0,0) to cover (4,0),then the original value at (4,0) must be stored before coverage or the whole cycle will be initialized

to the cycle header

2.edge condition handling

 

source code for above example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<algorithm>
 
using namespace std;
const int maxn = 100;
int matrix1[maxn][maxn];
int matrix2[maxn][maxn];
void trans(int h,int w)
{
    for(int i = 0; i < h; ++i)
    {
        for(int j = 0; j < w; ++j)
        {
            //要旋转的元素是m1[i+1][j+1],转过去的位置是m2[j][n-i]
            matrix2[j][w-i-1] = matrix1[i][j];
        }
    }
    return;
}
inline void getPos(int orix,int oriy,int *newx,int *newy){
    (*newx) = oriy;
    (*newy) = 4 - orix;
//  return 0;
}
void inPlaceTrans(int i,int j){ //(i,j)为转换的起点
    int total = 25;
    int cnt = 0;
    int x = -1,y = -1;
    int orix = i,oriy = j;
    bool visit[5][5];
    memset(visit,0,sizeof(visit));
    visit[i][j] = 1;
    int tmp1,tmp2;
    while(cnt < total){    //我去,移反了,所有的值都initialize成圈头值了
        //a new cycle
        orix = i; oriy = j;
        getPos(i,j,&x,&y); //(i,j)的目标地址
        visit[i][j] = true;//这个位置的元素已经被移到目标地址
        tmp1 = matrix1[i][j];
        while(!(x == orix && y == oriy)){  //这个圈没有到头
            tmp2 = matrix1[x][y];
            matrix1[x][y] = tmp1;
            ++cnt;  //移过去了一个元素
            i = x;
            j = y;
            visit[i][j] = true;
            tmp1 = tmp2;
            getPos(i,j,&x,&y);
        }
        matrix1[x][y] = tmp1;
        bool get = false;
        for(int u = 0; u < 5; ++u){
            for(int v = 0; v < 5; ++v){
                if(visit[u][v] == 0){   //这个元素还没有被移到目标地址
                    i = u;
                    j = v;
                    get = true;
                    break;
                }
            }
            if(get)
                break;
        }
        if(!get){   //所有元素都被移到目标地址
            break;
        }
    }
}
int main()
{
    freopen("1.txt","r",stdin);
    freopen("2.txt","w",stdout);
    cout << "helloworld\n";
    for(int i = 0; i < 5; ++i)
    {
        for(int j = 0; j < 5; ++j)
        {
            scanf("%d",matrix1[i]+j);
        }
    }
    inPlaceTrans(0,0);
    for(int i = 0; i < 5; ++i)
    {
        for(int j = 0; j < 5; ++j)
        {
            printf("%d   ",matrix1[i][j]);
        }
        cout << endl;
    }
    cout << "hello world\n";
    return 0;
}

  

 

 

 

 

InPlace Transition of a matrix,布布扣,bubuko.com

InPlace Transition of a matrix

标签:com   class   blog   div   code   size   string   color   tab   get   ble   

原文地址:http://www.cnblogs.com/warmfrog/p/3695011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!