Filename: prob28.c
// Problem 28 // // Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: // // 21 22 23 24 25 // 20 7 8 9 10 // 19 6 1 2 11 // 18 5 4 3 12 // 17 16 15 14 13 // // It can be verified that the sum of the numbers on the diagonals is 101. // // What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way? #include <stdio.h> #define SPIRAL_SIZE 1001 enum { RIGHT, LEFT, UP, DOWN }; int spiral[SPIRAL_SIZE][SPIRAL_SIZE]; void print_spiral() { int i; int j; printf("\n"); for(i=0; i<SPIRAL_SIZE; ++i) { for(j=0; j<SPIRAL_SIZE; ++j) printf("%03d ", spiral[j][i]); printf("\n"); } } int main() { int i, j; for(i=0; i<SPIRAL_SIZE; ++i) for(j=0; j<SPIRAL_SIZE; ++j) spiral[i][j] = -1; int x = SPIRAL_SIZE/2; int y = SPIRAL_SIZE/2; int cur_value = 1; int last_direction = UP; while(cur_value <= SPIRAL_SIZE*SPIRAL_SIZE) { spiral[x][y] = cur_value; // print_spiral(spiral); switch(last_direction) { case UP: if(spiral[x+1][y] == -1) { ++x; last_direction = RIGHT; } else { --y; last_direction = UP; } break; case DOWN: if(spiral[x-1][y] == -1) { --x; last_direction = LEFT; } else { ++y; last_direction = DOWN; } break; case RIGHT: if(spiral[x][y+1] == -1) { ++y; last_direction = DOWN; } else { ++x; last_direction = RIGHT; } break; case LEFT: if(spiral[x][y-1] == -1) { --y; last_direction = UP; } else { --x; last_direction = LEFT; } break; default: printf("ERROR\n"); break; } ++cur_value; } // add up diagonals int total = 0; for(i=0; i<SPIRAL_SIZE; ++i) total += spiral[i][i]; for(i=0; i<SPIRAL_SIZE; ++i) total += spiral[i][SPIRAL_SIZE-i-1]; printf("%d\n", total-1); return 0; }
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment