蓝桥杯之最简单的分治法-----数字旋转方阵
2016-03-19 01:09
387 查看
有一个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
={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,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
={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 ;
}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法