This is one of the interview questions I faced recently and thought I would share it.
Question:
Given a matrix print all its value in a circular fashion like shown in the image below.
Solution:
To attack this problem we definitely want to have a left-right, top-bottom, right-left and bottom-top spans. For attaining this, we obviously want to have 4 loops. The C++ code is given below.
//============================================================================ // Name : circular_matrix_read.cpp // Author : c++ // Description : output given matrix elements circularly //============================================================================ #include <iostream> using namespace std; #define HEIGHT 6 #define WIDTH 3 int main() { //int array[HEIGHT][WIDTH] = {{1,2,3,4,5},{16,17,18,19,6},{15,24,25,20,7},{14,23,22,21,8},{13,12,11,10,9}}; //int array[HEIGHT][WIDTH] = {{1,2,3,4,5,6},{14,15,16,17,18,7},{13,12,11,10,9,8}}; int array[HEIGHT][WIDTH] = {{1,2,3},{14,15,4},{13,16,5},{12,17,6},{11,18,7},{10,9,8}}; int maxh = HEIGHT-1, maxw = WIDTH-1; int minh = 0, minw = 0; while(1) { if(minh > maxh || minw > maxw) break; //top-left to top-right for(int i=minh,j=minw;j<=maxw;j++) cout << array[i][j] << endl; minh++; if(minh > maxh || minw > maxw) break; //top-right to bottom-right for(int i=minh,j=maxw;i<=maxh;i++) cout << array[i][j] << endl; maxw--; if(minh > maxh || minw > maxw) break; //bottom-right to bottom-left for(int i=maxh,j=maxw;j>=minw;j--) cout << array[i][j] << endl; maxh--; if(minh > maxh || minw > maxw) break; //bottom-left to top-left for(int i=maxh,j=minw;i>=minh;i--) cout << array[i][j] << endl; minw++; } return 0; } //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Cheers!
Bragaadeesh.
4 comments:
Dear Bragadeesh,
I have seen this question in many places and have seen quite a lot of complicated solutions
But your way of approach rocks :-)
Glad it does :)
simple & sweet solution liked it :)
@getting head, thanks for the visit !
Post a Comment