最近几天忙着看指针和数组的关系,把书翻了起来,不翻不要紧,一翻吓一跳,本以为网上资源那么丰富,不需要去翻书本,然而并不是这样,网上讲的很片面,书上的细节很多,需要静下心来去慢慢啃。前几天校园网故障,一直上不去网,于是也就无法写博客了,昨天来网了,而昨天又是蓝桥杯校赛,于是就耽搁了写博客,最主要也是刚开始并不习惯写博客。
不说那么多没用的,既然昨天进行了蓝桥杯校赛,那我们就来说说这个校赛,校赛一共五道题,前三道都不值一提,只有第四、五道是难点,尤其是第四道,特别难搞,而第五道有简单的思路,但是思路简单了,编程就复杂了,目前还没有想到什么好办法,而第四道,本身思路就麻烦,编程还难,细节问题太多,他究竟是什么题呢,现在我们来看看。。。。。。
昨天的第四题,题本身看似很简单,很容易理解,如下:
在一行输入一个N,然后在下方输出一个NxN数据方阵,如图:
就这么短短的一道题,难住了我,一次次分析算法,最后终于想到了思路,可是没有时间去写细节代码,因为太乱了,细节处可以说是毫无规章,总的来说是利用二维数组,用了11个for循环,第一个for循环,是用来循环固定TuXing[i][i](i < N/2),也就是确定每一圈数字循环的第一个(左上角的那个数字,作为每一圈递加的开始),后面接着是四个双重for循环嵌套,把递加的四种情况按照上半部从左至右依次递加、右半部从上至下依次递加、下半部从右至左依次递加、左半部从下至上一次递加的顺训编写,保证每个循环头尾相连,环环相扣,最后再跟一个双重for循环嵌套,依次输出二维数组的每个一数据,保证了数据的正常输出,最后形成一个回字型输出方针,细节问题特别耐人寻味,需要特别斟酌。代码如下:
#include <stdio.h>
int main(int argc, const char * argv[])
{
int TuXing[100][100],i=0,j=0;
float N=0;
TuXing[0][0]=1;
scanf("%g",&N);
for (i=1; i<N/2; i++)
{
TuXing[i][i]=TuXing[i-1][i-1]+(N-2*(i-1)-1)*4;
}
for (i=0; i<N/2; i++)
{
for (j=i+1; j<N-i; j++)
{
TuXing[i][j]=TuXing[i][j-1]+1;
}
}
for (j=N-1; j>N/2-0.5; j--)
{
for (i=N-j; i<j+1; i++)
{
TuXing[i][j]=TuXing[i-1][j]+1;
}
}
for (i=N-1; i>N/2-0.5; i--)
{
for (j=i-1; j>N-2-i; j--)
{
TuXing[i][j]=TuXing[i][j+1]+1;
}
}
for (j=0; j<N/2-1; j++)
{
for (i=N-j-2; i>j; i--)
{
TuXing[i][j]=TuXing[i+1][j]+1;
}
}
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
{
printf("%d\t",TuXing[i][j]);
}
printf("\n");
}
return 0;
}
此代码在Mac系统下的Xcode编译环境中试验成功,但是在上面的规定范围中,有一部分输出结果会变形,不是正方形的存在,那是因为屏幕界面的影响,屏幕分辨率和屏幕大小以及字体大小的原因,导致屏幕无法完整的按要求输出成矩阵,一行无法表示N个数据,故会换行,这里需要明确声明,不是代码的问题,是硬件设施的问题,假如屏幕足够大,分辨率足够大,那么别说N=100时的结果,纵使N=1000也可以照样无误输出。
昨天,做出这道题我很激动,感觉自己对编程的细节问题有了新的理解更深入的理解,编程是一门艺术,很多时候需要遵守一些编程规范,这就好比,毕加索的画是现代派风格,这“现代派”就是他的规范,而他的内容是由他自己创作出来的,那是艺术。编程也是,很多细节问题需要我们人性化的去改变,去找到合适的方法,也许方法不止一种,但是每一种都是艺术,有些代码也许是我们臆想的,根本和题没有直接关系,但是他可以解决我们的问题,这就是编程的人性化,艺术化,并不是每个搞编程的人都会感觉编程是枯燥无味的,那是因为艺术从来就不是每个人都欣赏的了的,但是总有一些人懂得他的艺术。。。。。。
编程,努力去找多种编程方法,不把代码搞的千篇一律;努力去优化自己的代码,不让代码占用多余的内存;努力去创造代码,让自己的代码独树一帜……这就是我的编程艺术!
好了,废话一箩筐,但是今天主要记录的是自己对这道题的见解,希望可以对自己以后的编程道路有所帮助。