坐标移动
题目描述
开发一个坐标计算工具, 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)
Analysis:
1 分割字符串
2 判断分割后的字符串坐标是否合法
3对合法的字符串坐标判断方向,并将字符串中的数字提取出来,在前面的坐标基础上进行运算
4 确定运算规则:初始坐标(x,y)
字符串为A num===》x-=num
字符串为S num===》y-=num
字符串为W num===》y+=num
字符串为D num===》x+=num
codes:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 string str; 6 while(cin>>str) 7 { 8 pair<int,int> point(0,0); 9 size_t found=str.find_first_of(';'); 10 int start=0; 11 12 while(found!=string::npos) 13 { 14 string s1=str.substr(start,found-start); 15 start=found+1; 16 found=str.find_first_of(';',found+1); 17 18 if(s1.size()>1 && s1.size()<=3) 19 { 20 char c=s1[0]; 21 int n=0; 22 int invalid=0; 23 for(int i=1;i<s1.size();i++) 24 { 25 if(s1[i]>='0' && s1[i]<='9') n=n*10+(s1[i]-'0'); 26 else { 27 invalid=1; 28 break; 29 } 30 } 31 if(invalid==0){ 32 switch(c) 33 { 34 case 'A':{point.first-=n;break;} 35 case 'D':{point.first+=n;break;} 36 case 'W':{point.second+=n;break;} 37 case 'S':{point.second-=n;break;} 38 39 } 40 } 41 } 42 //cout<<point.first<<','<<point.second<<endl; 43 } 44 cout<<point.first<<','<<point.second<<endl; 45 } 46 return 0; 47 }