That's cool, the program work perfectly as required. Slashfear, you rock buddy.
Here is my piece of code for same problem.
#include "stdio.h"
void create_spiral(int **spiral, int spiral_size, int spiral_level) {
int i = 0;
//Calculating first value at level spiral_level
int current_size = spiral_size - 2*spiral_level;
int value = spiral_size*spiral_size - current_size*current_size + 1;
//Populate data from left to right for spiral at level spiral_level
for(i = 0; i < (spiral_size - 2*spiral_level); i++) {
spiral[spiral_level][spiral_level+i] = value;
value++;
}
//Populate data from top to bottom for spiral at level spiral_level
for(i = 1; i < (spiral_size - 2*spiral_level); i++) {
spiral[spiral_level + i][spiral_size - spiral_level - 1] = value;
value++;
}
//Populate data from right to left for spiral at level spiral_level
for(i = (spiral_size - 2*spiral_level -2); i >= 0; i--) {
spiral[spiral_size - spiral_level -1][spiral_level + i] = value;
value++;
}
//Populate data from bottom to top for spiral at level spiral_level
for(i = (spiral_size - 2*spiral_level -2); i > 0; i--) {
spiral[spiral_level + i][spiral_level] = value;
value++;
}
}
void print_spiral(int **spiral, int spiral_size) {
int i = 0, j = 0;
for(i = 0; i < spiral_size; i++) {
for(j = 0; j < spiral_size; j++) {
printf("%d ", spiral[i][j]);
}
printf("\n");
}
}
int main() {
int spiral_size = 0;
int **spiral = NULL;
int max_spiral_level = 0;
int i = 0;
//Take size of spiral as input
scanf("%d", &spiral_size);
//validate size of spiral
if(spiral_size < 1) {
printf("Invalid size for spiral\n");
return 0;
}
//Allocate memory for spiral
spiral = (int**)malloc(sizeof(int*) * spiral_size);
for(i = 0; i < spiral_size; i++) {
spiral[i] = (int*)malloc(sizeof(int) * spiral_size);
}
//Determine number of level of spiral
max_spiral_level = (spiral_size + 1)/2;
//For each level of spiral populate data
for(i = 0; i < max_spiral_level; i++) {
create_spiral(spiral, spiral_size, i);
}
//Print the spiral
print_spiral(spiral, spiral_size);
//Free memory allocated for spiral
for(i = 0; i < spiral_size; i++) {
free(spiral[i]);
}
free(spiral);
return 0;
}
Compile the file with above code and run as:
a.exe < input.txt > output.txt [on windows]
a.out < input.txt > output.txt [on linux]
Here,
a.exe or a.out are the executables generated after compilation
input.txt is the file containing order of the spiral matrix need to be given as input, e.g., if the matrix is of order 5, then input.txt will be
5
output.txt is the output file containing result, for given example output.txt will contain
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
-Pradeep