螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题
原创
如图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