閱讀121 返回首頁    go 微軟 go windows


分治法-簡單矩陣

輸出如下所示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 25 26 27 12
6  7  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;
}

最後更新:2017-04-03 12:55:52

  上一篇:go 分治法-歸並排序
  下一篇:go 知識擴展——為什麼Windows的第一個盤叫C盤,不叫A盤?