蓝桥杯之最简单的分治法-----数字旋转方阵

有一个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 ;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值