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

  • 相关阅读:
    ThinkCMF框架任意内容包含
    网站防篡改脚本
    Apache Solr Velocity模板远程代码执行
    BurpSuite Intruder模块匹配返回包内容
    Kibana<6.6.0代码执行漏洞复现
    Thinkphp远程代码执行 payload汇总
    常用端口 简洁版
    NISP二级笔记(一) 信息安全管理
    oracle 中的角色
    oracle 用户对象权限
  • 原文地址:https://www.cnblogs.com/chiweiming/p/8776415.html
Copyright © 2011-2022 走看看