zoukankan      html  css  js  c++  java
  • 螺旋折线——第九届蓝桥杯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

  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/chiweiming/p/8776415.html
Copyright © 2011-2022 走看看