ぶんかつほう


以下に示すN*N(1<=N<=10)の数学方程式を出力する
入力:6
出力:1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 13 5 24 26 27 12 6 8 9 10 11
構想:分治法を利用して、層ごとに数を記入して、先に最外層を記入します:
1 20 19 18 17 16 2                     15 3                     14 4                     13 5                     12 6  7  8  9   10  11
実装コード:
#include<stdio.h>
int data[1000][1000]; 
void Full(int number,int begin,int size)
{   // number    size  ,       (begin,begin) 
     int i,j,k;
     if(size==0)
     return;
     if(size==1)
     {
        data[begin][begin];
        return;
     } 
     i=begin;j=begin;
     for(k=0;k<size-1;k++)//        
     {
        data[i][j]=number;
        number++;i++;
     }
     for(k=0;k<size-1;k++)//        
     {
        data[i][j]=number;
        number++;j++;
     }
     for(k=0;k<size-1;k++)//        
     {
        data[i][j]=number;
        number++;i--;
     }
     for(k=0;k<size-1;k++)//        
     {
        data[i][j]=number;
        number++;j--;
     }
     Full(number,begin+1,size-2);//    ,      begin+1
     //                        2; 
}
int main()
{
    int i,j,n,m;
    scanf("%d",&n);
    Full(1,0,n);
    for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       printf("%4d",data[i][j]); 
       puts("");
    }
    return 0;
}