坐标移动

来源:互联网 发布:js 父窗口 span 编辑:程序博客网 时间:2024/06/10 04:52

开发一个坐标计算工具, 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)

 题目类别: 字符串 难度: 中级 运行时间限制:10Sec内存限制:128MByte阶段: 入职前练习 输入: 

一行字符串

 输出: 

最终坐标,以,分隔

 样例输入:
A10;S20;W10;D30;X;A1A;B10A11;;A10;                   

例输出:

10,-10                   

#include <iostream>#include <string>#include <cstring>#include <cctype>using namespace std;int main(){int x=0,y=0;int flag = 1;    //状态标识,0表示计算遇到非法字符,2表示正在计算操作数数char current;    //保存当前操作:A D W Sint sum = 0;     //计算移动数大小char s[1024] = {0};  //保存输如字符串size_t len;int i;gets(s);len = strlen(s);//cout<<len<<" ";for(i = 0; i < len; i++)  //处理{if(s[i] == ';' && flag)  //遇到‘;’并且计数过程中没有遇到非法字符 flag!=0{switch(current)   //执行对应操作{case 'A':x -= sum;break;case 'D':x += sum;break;case 'W':y += sum;break;case 'S':y -= sum;break;default:break;}flag = 1;sum = 0;current = ' ';continue;}//遇到操作符,判断该操作符是否合法if(s[i] == 'A' || s[i] == 'S' || s[i] == 'W' || s[i] == 'D')  {if(flag != 2)  //确定不是在计算操作数时遇到的字符,如果是则不处理{if(i >= 1){if(s[i-1]== ';')  //前一个字符确定为‘;’,{current = s[i];continue;}}else            //如果是第一个字符,则直接保存{current = s[i];continue;}}}//当前保存的为操作符,则计算操作数if(current == 'A' || current == 'S' ||current == 'W'|| current == 'D')  {if(!isdigit(s[i]))  //遇到非数字,则初始化,继续下一循环{flag = 0;      sum = 0;current = ' ';continue;}else            //否则计算操作数{flag = 2;   //正在计算操作数标记sum = sum *10 + s[i] - '0';//cout<<sum<<" ";}}}cout<<x<<','<<y;return 0;}

上面的代码是早些时候写的,其实现在想想应该可以以';'为分解符,取出每一个字符串再进行判断处理会更加方便!



0 0