题解 | #坐标移动#
坐标移动
http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
纯模拟,双指针,逐个判断。
#include<stdio.h>
#include<string.h>
//检查每一次的输入是否正确,不正确返回-1,正确则返回移动的距离。
int check(char *s,int left,int right){
int value = 0;
int len = right - left;
//输入长度是否合法
if(len > 3 || len < 2) return -1;
//第一个字符是否合法
switch(s[left]){
case 'A':
case 'S':
case 'W':
case 'D':
//数字字符是否合法
if(len==2){
if(s[left+1]<'0'||s[left+1]>'9') return -1;
else return s[left+1] - '0';
}
else{
if(s[left+1]<'0'||s[left+1]>'9') return -1;
if(s[left+2]<'0'||s[left+2]>'9') return -1;
//两位数的距离。
return (s[left+1] - '0')*10 + s[left+2] - '0';
}
default:return -1;
}
return value;
}
int main(){
char s[10001] = {0};
scanf("%s\n",s);
int x = 0;
int y = 0;
//双指针限制每次的输入,left指向起点,right指向每个分号。
int left = 0;
int right = 0;
int len = strlen(s);
for(int i = 0; i < len; i++){
int temp = 0;
if(s[i]==';'){
right = i;
temp = check(s, left, right);
//如果移动距离合法,则根据情况修改坐标。
if(temp!=-1){
switch(s[left]){
case 'A':x = x - temp;break;
case 'S':y = y - temp;break;
case 'W':y = y + temp;break;
case 'D':x = x + temp;break;
}
}
//left移动到下一个输入的起点
left = right+1;
}
}
printf("%d,%d",x,y);
return 0;
}
查看17道真题和解析