关于蓝桥杯15届校赛第四题

最近几天忙着看指针和数组的关系,把书翻了起来,不翻不要紧,一翻吓一跳,本以为网上资源那么丰富,不需要去翻书本,然而并不是这样,网上讲的很片面,书上的细节很多,需要静下心来去慢慢啃。前几天校园网故障,一直上不去网,于是也就无法写博客了,昨天来网了,而昨天又是蓝桥杯校赛,于是就耽搁了写博客,最主要也是刚开始并不习惯写博客。

不说那么多没用的,既然昨天进行了蓝桥杯校赛,那我们就来说说这个校赛,校赛一共五道题,前三道都不值一提,只有第四、五道是难点,尤其是第四道,特别难搞,而第五道有简单的思路,但是思路简单了,编程就复杂了,目前还没有想到什么好办法,而第四道,本身思路就麻烦,编程还难,细节问题太多,他究竟是什么题呢,现在我们来看看。。。。。。

昨天的第四题,题本身看似很简单,很容易理解,如下:

在一行输入一个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也可以照样无误输出。

昨天,做出这道题我很激动,感觉自己对编程的细节问题有了新的理解更深入的理解,编程是一门艺术,很多时候需要遵守一些编程规范,这就好比,毕加索的画是现代派风格,这“现代派”就是他的规范,而他的内容是由他自己创作出来的,那是艺术。编程也是,很多细节问题需要我们人性化的去改变,去找到合适的方法,也许方法不止一种,但是每一种都是艺术,有些代码也许是我们臆想的,根本和题没有直接关系,但是他可以解决我们的问题,这就是编程的人性化,艺术化,并不是每个搞编程的人都会感觉编程是枯燥无味的,那是因为艺术从来就不是每个人都欣赏的了的,但是总有一些人懂得他的艺术。。。。。。

编程,努力去找多种编程方法,不把代码搞的千篇一律;努力去优化自己的代码,不让代码占用多余的内存;努力去创造代码,让自己的代码独树一帜……这就是我的编程艺术!

好了,废话一箩筐,但是今天主要记录的是自己对这道题的见解,希望可以对自己以后的编程道路有所帮助。

:国王的烦恼 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。 如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起抗议。 现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们会有多少天进行抗议。 【输入格式】 输入的第一行包含两个整数n, m,分别表示小岛的个数和桥的数量。 接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。 【输出格式】 输出一个整数,表示居民们会抗议的天数。 【样例输入】 4 4 1 2 2 1 3 2 2 3 1 3 4 3 【样例输出】 2 【样例说明】 第一天后2和3之间的桥不能使用,不影响。 第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。 第三天后3和4之间的桥不能使用,居民们会抗议。 【数据规模与约定】 对于30%的数据,1<=n<=20,1<=m<=100; 对于50%的数据,1<=n<=500,1<=m<=10000; 对于100%的数据,1<=n<=10000,1<=m<=100000,1<=a, b<=n, 1<=t<=100000。 【资源约定】 峰值内存消耗 < 64M CPU消耗 < 3000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值