欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-15 21:59:24
原创 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)=3, dis(-2, -1)=9 给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 【输入格式 ......

原创


如图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