>>687 頑張ってみた
#include<stdio.h>
#include<stdlib.h>
int get_num(int n, int x, int y){
int dx, dy, d, i, offset=1, ret=-1;
dx=(x>n-1-x)?n-1-x:x;
dy=(y>n-1-y)?n-1-y:y;
d=(dx>dy)?dy:dx; // (x,y) は d 周目上にある
for(i=0;i<d;i++){
offset+=(n-1)*4; // offset は d 周目渦巻きの左上の数値
n-=2;
}
x-=d; y-=d; // (x,y) を d 周目左上 (d,d) からの相対座標に変換
if(y==0) ret=offset+x; // 上辺
else if(x==n-1) ret=offset+(n-1)+y; // 右辺
else if(y==n-1) ret=offset+(n-1)*3-x; // 底辺
else if(x==0) ret=offset+(n-1)*4-y; // 左辺
return ret;
}
int main(int argc, char *argv[]){
int n=5, fmt_width, x, y;
char tmp[20];
if(argc==2) n=atoi(argv[1]);
fmt_width=sprintf(tmp, "%d", n*n);
for(y=0;y<n;y++){
for(x=0;x<n;x++) printf("%0*d", fmt_width, get_num(n, x, y));
printf(" ");
for(x=n-1;x>=0;x--) printf("%0*d", fmt_width, get_num(n, x, y));
printf("\n");
}
return 0;
}