Print a spiral array
For example:
7 8 9 10
6 1 2 11
5 4 3 12
15 14 13
Solution
Calculate position and number based on its level
#include <iostream>
#include <iomanip>
using namespace std;
void spiral_array(int n)
{
if(n <= 0){
cout << "n should great than 0" << endl;
return;
}
if(n == 1){
cout << n << endl;
return;
}
int m = 0;
while((2 * m + 1) * (2 * m + 1) <= n){
m++;
}
int i, j, k = 1, l = 0;
int *arr = new int[(2 * m + 1) *(2 * m + 1)];
for(i = 0; i < (2 * m + 1) * (2 * m + 1); i ++){
arr[i] = 0;
}
i = 0;
j = 0;
while(k <= n){
arr[(i + m) * (2 * m + 1) + (j + m)] = k;
if(j == l && i == -l){
j++;
l++;
}
else{
if(j == l && i < l){
i ++;
}
else if(i == l && j > -l){
j --;
}
else if(j == -l && i > -l){
i --;
}
else if(i == -l && j < l){
j ++;
}
}
k++;
}
for(i = 0; i < 2 * m + 1; i ++){
for(j = 0; j < 2 * m + 1; j ++){
if(arr[i * (2 * m + 1) + j] != 0){
printf("%4d ", arr[i * (2 * m + 1) + j]);
}
else{
printf(" ");
}
}
printf("\n");
}
delete[] arr;
}
int main(int argc, char* argv[])
{
for(int i = 0; i < 17; i ++){
spiral_array(i);
}
return 0;
}