螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题

时间:2022-09-10 13:48:16

原创


如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。 
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 
例如dis(0, 1)=3, dis(-2, -1)=9 
给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 
【输入格式】 
X和Y 
对于40%的数据,-1000 <= X, Y <= 1000 
对于70%的数据,-100000 <= X, Y <= 100000 
对于100%的数据, -1000000000 <= X, Y <= 1000000000 
【输出格式】 
输出dis(X, Y)

【样例输入】 
0 1 
【样例输出】 
3

资源约定: 
峰值内存消耗(含虚拟机) < 256M 
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。 
注意: 
main函数需要返回0; 
只使用ANSI C/ANSI C++ 标准; 
不要调用依赖于编译环境或操作系统的特殊函数。 
所有依赖的函数必须明确地在源文件中 #include 
不能通过工程设置而省略常用头文件。 
提交程序时,注意选择所期望的语言类型和编译器类型。

螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题

我的解题思路很简单很直白,由于行驶轨迹已经固定,所以只要从原点开始沿着轨迹边走边判断即可。

分为左/上/右/下四个方向按顺序(行驶轨迹固定)行走,可以看到先向左1步、上1步、右2步、下2步;

然后左3步(+2)、上3步(+2)、右4步(+2)、下4步(+2);以后都是每次+2;我们每走一步就判

断是否到终点。(代码不够简练,有错误很欢迎指正)

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int xx[]={-1,0,1,0};    //左上右下
 5 int yy[]={0,1,0,-1};  6 
 7 int count;    //计数器 
 8 
 9 int left=1;    //4个方向初值 
 10 int up=1;  11 int right=2;  12 int down=2;  13 
 14 int main()  15 {  16     long long x,y;  17     scanf("%I64d%I64d",&x,&y);  18     
 19     int dx=0;  20     int dy=0;  21     int c=0;  22     int flag=0;    //标志 
 23     
 24     if( dx==x && dy==y )  25  {  26         printf("0");  27         return 0;  28  }  29         else
 30  {  31             int i;  32             for(i=0;i<=3;i++)  33  {  34                 c=0;  35                 if(i==0)    //
 36  {  37                     while(c<left)  38  {  39                         dx+=xx[i];  40                         dy+=yy[i];  41                         count+=fabs(xx[i])+fabs(yy[i]);    //加步数
 42                         if(dx==x && dy==y)    //走了以后判断
 43  {  44                             flag=1;  45                             break;  46  }  47                         c++;  48  }  49                     if(flag==1)  50                         break;  51                     left+=2;    //步数+2 
 52  }  53                 if(i==1)    //
 54  {  55                     while(c<up)  56  {  57                         dx+=xx[i];  58                         dy+=yy[i];  59                         count+=fabs(xx[i])+fabs(yy[i]);  60                         if(dx==x && dy==y)  61  {  62                             flag=1;  63                             break;  64  }  65                         c++;  66  }  67                     if(flag==1)  68                         break;  69                     up+=2;  70  }  71                 if(i==2)    //
 72  {  73                     while(c<right)  74  {  75                         dx+=xx[i];  76                         dy+=yy[i];  77                         count+=fabs(xx[i])+fabs(yy[i]);  78                         if(dx==x && dy==y)  79  {  80                             flag=1;  81                             break;  82  }  83                         c++;  84  }  85                     if(flag==1)  86                         break;  87                     right+=2;  88  }  89                 if(i==3)    //
 90  {  91                     while(c<down)  92  {  93                         dx+=xx[i];  94                         dy+=yy[i];  95                         count+=fabs(xx[i])+fabs(yy[i]);  96                         if(dx==x && dy==y)  97  {  98                             flag=1;  99                             break; 100  } 101                         c++; 102  } 103                     if(flag==1) 104                         break; 105                     down+=2; 106  } 107                 if(i==3)    //再次相加
108                     i=-1; 109  } 110  } 111     printf("%d",count); 112     return 0; 113 }

09:49:11

2018-04-10