输入:当前层左上角要填的数字Number,左上角的坐标begin,方阵的阶数为size
输出:数字旋转方阵
1.如果size=0,则算法结束
2.如果size=1,则data[begin][begin]=number
3.初始化行、列的下标 i=begin、j=begin
4.重复下述的操作size-1次,填写红色区域
4.1 data[i][j] = number,number++
4.2 行下标 i++,列下表不变
5.重复下述的操作size-1次,填写黄色区域
5.1 data[i][j] = number,number++
5.2 行下标 不变,列下表 j++
6.重复下述的操作size-1次,填写蓝色区域
6.1 data[i][j] = number,number++
6.2 行下标 i--,列下表不变
7.重复下述的操作size-1次,填写绿色区域
7.1 data[i][j] = number,number++
7.2 行下标 不变,列下表 j--
8.调用函数Full在size-2阶方阵中左上角begin+1处从数字number开始填数。
#include <stdio.h>
#define SizeMax 100;
int data[100][100]={};
void Full(int number,int begin,int size)
{ //从number开始写size方阵,左上角的下标为(begin,begin)
int i,j,k;
//递归的边界条件,如果size=0,无需填写
if(size==0)
return;
//如果size=1
if(size==1)
{
//此时的数值就等于初始的number值
data[begin][begin]=number;
return;
}
//初始化左上角下标
i=begin;
j=begin;
//填写A区域,共有size-1个数
for(k=0;k<size-1;k++)
{
//当前的位置数值为number
data[i][j]=number;
//行下标向下移动的同时,number自增
number++;
i++;
}
//填写B区域,共有size-1个数
for(k=0;k<size-1;k++)
{
//当前的位置数值为number
data[i][j]=number;
//列下标向右移动的同时,number自增
number++;
j++;
}
//填写C区域,共有size-1个数
for(k=0;k<size-1;k++)
{
//当前的位置数值为number
data[i][j]=number;
//行下标向上移动的同时,number自增
number++;
i--;
}
//填写D区域,共有size-1个数
for(k=0;k<size-1;k++)
{
//当前的位置数值为number
data[i][j]=number;
//列下标向左移动的同时,number自增
number++;
j--;
}
//递归求解,左上角下标为begin-1
Full(number,begin+1,size-2);
}
int main(){
int number,begin,size;
//number的初始值为 1
number=1;
printf("Please enter the size:");
scanf("%d",&size);
//调用Full方法
Full(number,begin,size);
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
printf("%4d",data[i][j]);
}printf("\n");
}
}