有一个N*N的方阵,如图要求如图数出这个方阵
首先我们讲讲分治法,分治,分治,分而治之
我们将这张图片分为这样
1,2,3,4,5这列为一组 输入时候,只需要行数加1
6,7,8,9,10这行为一组 输入时候,只需要列数加1
11,12,13,14,15这行为一组 输入时候,只需要行数减1
16,17,18,19,20这行为一组 输入时候,只需要列数减1
此为分而治之
#include<stdio.h>
#define n 10
int data[n][n]={0};
void full(int number,int begin,int size);
void outprint(int size);
int main(){
int a;
printf("输入阶数小于10");
scanf("%d",&a);
full(1,0,a);
outprint(a);
return 0;
}
void full(int number,int begin,int size){
int i,j,k;
if(size==0)
return;
if(size==1){
data[begin][begin]=number;
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); //我唯一不太明白的是为什么是size-2,最后才知道,每次完了之后上面最上面那一阶和最下面那一阶<span style="white-space:pre"> </span>//都有内容这样就损失了两阶
return ;
}
void outprint(int size){
int i,j;
for(i=0;i<size;i++){
for(j=0;j<size;j++){
printf("%4d",data[i][j]);
}printf("\n");
}
return ;
}