第九届蓝桥杯省赛--方格计数

一、问题描述

  

  如图所示,在二维平面上有无数个1x1的小方格。我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。你能计算出这个圆里有多少个完整的小方格吗?

  注意:需要提交的是一个整数,不要填写任何多余内容。

二、题目类型:结果填空、枚举

三、解题思路及代码

  一开始我很happy的解出答案=(半径-1)的平方 * 4。。。

  怎么可能这么简单!傻啊,情况都没有考虑清楚,哭唧唧,要真在考场上这样,我估计我就是比赛的重在参与型选手了。。。

  分析了半径=4的情况,看下图

  

  因为圆的对称性,所以只需要计算一个象限里的完整小方格,再乘以4就是结果。

  我一开始一直在找半径与方格数在数学上的关系,就比如:

    当 r = 1, 方格数 = 0;

    当 r = 2, 方格数 = 2*2;

    当 r = 3, 方格数 = (r-1)^2*4;

    当 r = 4, 方格数 = (r-1)^2-1*4;

    当 r = 5, 方格数 = (r-1)^2-3*4;

  我也是个“人才”(微笑)。。。我决定换个思路:计算方格顶点(x,y)到原点(0,0)的距离,如果小于半径r,那么这个方格就是完整的方格。因为对称性,所以只需要算一个象限的完整方格个数。所以代码是这样的:

 1 public class GridCount {
 2 
 3     public static void main(String[] args) {
 4         int count=0;//统计完整方格的个数
 5         int r=1000;
 6         for(int x=1; x<r; x++) {
 7             for(int y=1; y<r; y++) {
 8                 if(Math.pow(x, 2)+Math.pow(y, 2)< Math.pow(r, 2)) {
 9                     count++;
10                 }
11             }
12         }
13         System.out.print(count*4);
14     }
15 }

  嚯嚯,最后运行出来的结果为3137524,为了验证我代码的正确性,我把它带入当半径为3、4,结果跟手算的答案一样,可把我给开心的。

  到这里,如果你的结果跟我一样,那么恭喜你,这道题0分。

  仔细研究这个代码的思路,会发现漏考虑了一种情况:当方格顶点(x,y)到原点(0,0)的距离== r !!!这种情况不是没可能啊喂!可长点心吧,蓝桥杯提交答案并不是马上就能看到结果,如果你少考虑了一些特殊情况,就会导致题得0分!而且这还是结果填空题,要么0分要么得分,要么死要么活。。。

  当 r = 5的时候,出现“方格顶点(x,y)到原点(0,0)的距离== r”的情况,所以这也告诉我们,多测试点例子,说不定可以解决您欠考虑呢(微笑),wtf。

  修改代码逻辑,正确代码如下:

 1 public class GridCount {
 2 
 3     public static void main(String[] args) {
 4         int count=0;//统计完整方格的个数
 5         int r=1000;
 6         for(int x=1; x<r; x++) {
 7             for(int y=1; y<r; y++) {
 8                 if(Math.pow(x, 2)+Math.pow(y, 2)<= Math.pow(r, 2)) {
 9                     count++;
10                 }
11             }
12         }
13         System.out.print(count*4);
14     }
15 }

  运行得出的正确的结果为:3137548

四、反思与总结

  做结果填空题的时候,一定要用多一点的例子去测试代码逻辑的正确性,漏考虑现象在考场上发生很正常,只希望能够尽量发现自己代码的错误逻辑,争取做对题,把分拿下。

  考试坑很多,这是一个。明明思路正确,但却因为逻辑不够严密而丢分,实在可惜。考试时一定要时刻谨记注意代码逻辑的严密性!

  加油加油啦~

猜你喜欢

转载自www.cnblogs.com/crush-u-1214/p/10482228.html
今日推荐