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