C/C++编程题之坐标移动

简介: 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

在牛客上刷到“坐标移动”这道题,现在将通过的代码贴一下,供大家参考。


开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。


输入:


合法坐标为A(或者D或者W或者S) + 数字(两位以内)


坐标之间以;分隔。


非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。


下面是一个简单的例子 如:


A10;S20;W10;D30;X;A1A;B10A11;;A10;


处理过程:


起点(0,0)
+   A10   =  (-10,0)
+   S20   =  (-10,-20)
+   W10  =  (-10,-10)
+   D30  =  (20,-10)
+   x    =  无效
+   A1A   =  无效
+   B10A11   =  无效
+  一个空 不影响
+   A10  =  (10,-10)
结果 (10, -10)



注意请处理多组输入输出


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct s_point
{
    int x;
    int y;
};
int midec(int len)
{
    int mi=1;
    int i=0;
    for(i=0;i<len;i++)
    {
        mi*=10;
    }
    return mi;
};
int getpoint(char * pointstr,int *x,int *y)
{
    int l = strlen(pointstr);
    if(l<2) return 0;
    int i =0;
    char b = pointstr[0];
    int n = 0;
    if(b=='A' || b=='D'||b=='W'||b=='S')
    {
        for(i=1;i<l;i++)
        {
          if(pointstr[i]>='0' &&  pointstr[i]<='9')
          {
              n+=(pointstr[i]-'0')*midec(l-i-1);
          }
          else
          {
              return 0;
          }
        }
    }
    else 
    {
        return 0;
    }
    if(b=='A')
        *x=n*(-1);
    else if(b=='D')
        *x=n;
    else if(b=='W')
        *y=n;
    else if(b=='S')
        *y=n*(-1);
    return 1;
}
int main()
{
   struct s_point point;
   point.x=0;
   point.y=0;
   char inputstream[10000]={0};
   //gets(inputstream);
   //printf("%s",inputstream); 
   int i=0;  
   int l=0;   
   int index=0;
    int x,y; 
   char inputpoint[200]={0};
   while(gets(inputstream)!=NULL)
   {
     point.x=0;
     point.y=0; 
     i=0; 
     l=0;
     l=strlen(inputstream);
     for(i=0;i<l;i++)
     {
         //if(inputstream[i]!=' ')
         inputpoint[index++]=inputstream[i];
         if(inputstream[i]==';')
         {
             inputpoint[index-1]=0;
             x=0;
             y=0;
             if(getpoint(inputpoint,&x,&y)==1)
             {
                 point.x+=x;
                 point.y+=y;
             }
             //else
             //{
             // printf("inputpoint=%s\n",inputpoint);
             //}
             //memset(inputpoint,sizeof(inputpoint),0);
             index=0;
             //end = i-1;
             //start=i+1;
         }
         //else
         //{
         //  inputpoint[index++]=inputstream[i];
         //}
     }
     if(index>0)
     {
         if(getpoint(inputpoint,&x,&y))
         {
            point.x+=x;
            point.y+=y;
         }
     } 
     printf("%d,%d\n",point.x,point.y);
   }
   return 0;
}


相关文章
|
3天前
|
算法 编译器 C语言
探索C++编程的奥秘与魅力
探索C++编程的奥秘与魅力
|
1月前
|
安全 算法 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
48 3
|
1月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
248 3
|
1月前
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
238 0
|
1月前
|
安全 算法 C++
【C++泛型编程 进阶篇】模板返回值的优雅处理(二)
【C++泛型编程 进阶篇】模板返回值的优雅处理
33 0
|
1月前
|
安全 算法 编译器
【C++泛型编程 进阶篇】模板返回值的优雅处理(一)
【C++泛型编程 进阶篇】模板返回值的优雅处理
43 0
|
1月前
|
存储 网络协议 C语言
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
83 0
|
1月前
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
247 0
|
1月前
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
47 0
|
1月前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
259 2