Problem
/*
Given an mxn matrix, design a function that will print out the contents of the matrix in spiral format.
Spiral format means for a 5x5 matrix given below:
[ 1 2 3 4 5 ]
[ 6 7 8 9 0 ]
[ 1 2 3 4 5 ]
[ 6 7 8 9 0 ]
[ 1 2 3 4 5 ]
path taken is:
[ > > > > > ]
[ > > > > v ]
[ ^ ^ > v v ]
[ ^ ^ < < v ]
[ < < < < < ]
where ">" is going right, "v" going down, "<" is going left, "^" is going up.
The output is:
1 2 3 4 5 0 5 0 5 4 3 2 1 6 1 6 7 8 9 4 9 8 7 2 3
*/
Solution
/*
============================================================================
Author : James Chen
Email : a.james.chen@gmail.com
Description : Print out the contents of the matrix in spiral format
Created Date : 28-06-2013
Last Modified :
============================================================================
*/
#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;
void PrintArrayInSprial(int* squareArr, int size )
{
int level = (size + 1) >> 1;
int k = 0;
while(k < level){
int i = k;
int j = k;
while(j < size - k){
cout << setw(5) << squareArr[i * size + j];
j++;
}
j--;
i++;
while(i < size - k){
cout << setw(5) << squareArr[i * size + j];
i++;
}
i--;
j--;
while(j > k - 1){
cout << setw(5) << squareArr[i * size + j];
j--;
}
j++;
i--;
while(i > k){
cout << setw(5) << squareArr[i * size + j];
i--;
}
k ++;
}
cout << endl;
}
void PrintArray(int* squareArr, int size )
{
cout << "The array is" << endl;
for(int i = 0; i < size; ++i){
for(int j = 0; j < size; ++j){
cout << setw(5) << squareArr[i * size + j];
}
cout << endl;
}
cout << endl;
}
void IntializeArrayInSprial(int* squareArr, int size )
{
int level = (size + 1) >> 1;
int k = 0;
int m = 0;
while(k < level){
int i = k;
int j = k;
while(j < size - k){
squareArr[i * size + j] = m++;
j++;
}
j--;
i++;
while(i < size - k){
squareArr[i * size + j] = m++;
i++;
}
i--;
j--;
while(j > k - 1){
squareArr[i * size + j] = m++;
j--;
}
j++;
i--;
while(i > k){
squareArr[i * size + j] = m++;
i--;
}
k ++;
}
}
int main(int argc, char* argv[])
{
int* squareArr;
for(int i = 1; i < 6; ++i){
squareArr = new int[i * i];
IntializeArrayInSprial(squareArr, i);
PrintArray(squareArr, i);
PrintArrayInSprial(squareArr, i);
delete[] squareArr;
cout << "------------------------" << endl;
}
return 0;
}
Output
The array is
0
0
------------------------
The array is
0 1
3 2
0 1 2 3
------------------------
The array is
0 1 2
7 8 3
6 5 4
0 1 2 3 4 5 6 7 8
------------------------
The array is
0 1 2 3
11 12 13 4
10 15 14 5
9 8 7 6
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
------------------------
The array is
0 1 2 3 4
15 16 17 18 5
14 23 24 19 6
13 22 21 20 7
12 11 10 9 8
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
------------------------
Press any key to continue . . .