螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题
程序员文章站
2022-04-19 18:15:48
原创 如图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
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
我的解题思路很简单很直白,由于行驶轨迹已经固定,所以只要从原点开始沿着轨迹边走边判断即可。
分为左/上/右/下四个方向按顺序(行驶轨迹固定)行走,可以看到先向左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