数字旋转方阵 分治法

来源:互联网 发布:威锋认证的淘宝店 编辑:程序博客网 时间:2024/04/26 12:09
/*********************
数字旋转方阵
分治法
187
296
345
********************/
#include <stdio.h>
#define N 10     //定义符号常量N
int data[N][N]={0};   //定义全局数组data[N][N]并初始化为0

void Full(int number,int begin,int size)       //填写旋转方阵
{                            //从number开始填写size阶方阵,左上角的下表为(begin,begin)
    int i,j,k;
    if(size == 0)        //递归的边界条件,如果size=0,则无需填写
        return;
    if(size == 1)            //递归的边界条件,如果size=1
    {
        data[begin][begin] = number;  //只填写number
        return;
    }
    i = begin;j = begin;     //初始化左上角下标
    for(k = 0;k < size - 1;k++)        //填写区域A,共size-1个数
    {
        data[i][j] = number;number++;        //当前位置填写number
        i++;                            //行下标加1
    }
    for(k = 0;k<size-1;k++)                    //填写B区域,共size-1个数
     {
        data[i][j] = number;number++;
        j++;
    }
    for(k = 0;k < size - 1;k++)        //填写区域C,共size-1个数
    {
        data[i][j] = number;number++;        //当前位置填写number
        i--;                            //行下标减一
    }
    for(k = 0;k<size-1;k++)                    //填写D区域,共size-1个数
     {
        data[i][j] = number;number++;
        j--;                                //行下标减一
    }
    Full(number,begin+1,size-2);     //递归调用,左上角下标为size-1
    return;                    //结束函数Full的执行        
}


void OutPrint(int size)        //输出旋转方阵
{
    int i,j;
    for(i = 0;i < size; i++)            //输出第i行
    {
        for(j = 0;j < size;j++)                //输出第j列
            printf("%4d",data[i][j]);
        printf("\n");
    }
}

int main()
{
    int n;
    printf("输入方阵阶数(小于10):");
    scanf("%d",&n);
    Full(1,0,n);
    OutPrint(n);
    return 0;
    
    
    
}
1 0
原创粉丝点击