在一行上输入一个长度
,仅由可见字符构成的字符串
,代表输入的指令序列。
在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。
A10;S20;W10;D30;X;A1A;B10A11;;A10;
10,-10
对于这个样例,我们模拟小人的移动过程:
第一个指令
是合法的,向左移动
个单位,到达
点;
第二个指令
是合法的,向下移动
个单位,到达
点;
第三个指令
是合法的,向上移动
个单位,到达
点;
第四个指令
是合法的,向右移动
个单位,到达
点;
第五个指令
不合法,跳过;
第六个指令
不合法,跳过;
第七个指令
不合法,跳过;
第八个指令
不合法,跳过;
第九个指令
是合法的,向左移动
个单位,到达
点。
ABC;AKL;DA1;
0,0
#include <stdio.h> #include <ctype.h> int ismovesign(char s); int main() { int x, y; char ch; char sign[5] = {0}; int top = -1; int warnning; int num, digit; x = y = 0; while ((ch = getchar()) != '\n') { sign[++top] = ch; if (sign[top] == ';') { num = 0; digit = 1; sign[top--] = 0; // 把分号扔掉 while (top > 0) { if (!isdigit(sign[top])) // 默认栈底是字母,检查是否有未到栈底就出现了非数字的情况 { while (top != -1) { sign[top--] = 0; } warnning = 1; break; } else // 从个位开始执行加和 { num += (sign[top] - '0') * digit; digit *= 10; sign[top--] = 0; warnning = 0; } } if (warnning == 0) // { if(num < 100 && num > 0) // num∈[1,99] { switch (sign[top]) // 查询栈底的方向 { case 'W':y += num; break; case 'A':x -= num; break; case 'S':y -= num; break; case 'D':x += num; break; default: break; } } sign[top--] = 0; } } } printf("%d,%d", x, y); return 0; } int ismovesign(char s) { return (s == 'W' || s == 'A' || s == 'S' || s == 'D'); }
#include <stdio.h> #include <string.h> #include <stdlib.h> int x = 0, y = 0; void op(char* op) { int flag; char num[5]; char c = op[0]; if (c != 'A' && c != 'W' && c != 'S' && c != 'D') return ; for (int i = 1; i < strlen(op); i++) { c = op[i]; if (!(c >= '0' && c <= '9')) return; num[i - 1] = c; } num[strlen(op)-1]='\0'; int a = 0; for (int i = 0; i < strlen(num) ; i++) { a = a * 10 + (num[i] - '0'); } if (op[0] == 'A') x -= a; else if (op[0] == 'W') y += a; else if (op[0] == 'S') y -= a; else if (op[0] == 'D') x += a; } int main() { char s[10005]; gets(s); char* token = NULL; token = strtok(s, ";"); while (token != NULL) { op(token); token = strtok(NULL,";"); } printf("%d,%d",x,y); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> char InputString[10001] = { 0 }; int Coordinate[2] = { 0 }; bool IsLegalNumber(char Temp) { if ((Temp >= '0') && (Temp <= '9') ) { return true; } else { return false; } } bool IsLegalOrder(char Order[3]) { if ((Order[0] == 'W') || (Order[0] == 'A') || (Order[0] == 'S') || (Order[0] == 'D') ) { if (IsLegalNumber(Order[1])) { if(Order[2] != ';') { if(IsLegalNumber(Order[2])) { return true; }else { return false; } } else { return true; } } else { return false; } } else { return false; } } int main() { scanf("%s", InputString); for (int i = 0; i < strlen(InputString); i++) { if (IsLegalOrder(&InputString[i])) { char Temp[3] = { 0 }; int Step = 0; Temp[0] = InputString[i + 1]; if( InputString[i + 2] != ';') { Temp[1] = InputString[i + 2]; Temp[2] = '\0'; } else { Temp[1] = '\0'; } Step = atoi(Temp); switch (InputString[i]) { case 'W': Coordinate[1] += Step; break; case 'S': Coordinate[1] -= Step; break; case 'A': Coordinate[0] -= Step; break; case 'D': Coordinate[0] += Step; break; default: break; } } else { while (InputString[i] != ';') { i++; } } } printf("%d,%d", Coordinate[0], Coordinate[1]); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int x, y, len, i, j, tmp_len, count = 0; char str[10001] = {0}; while(scanf("%s", str) != EOF) { x = y = 0; len = strlen(str); for(i = 0; i < len; i++) { if(str[i] == ';') str[i] = '\0'; } for(i = 0; i < len; i++) { if(str[i] != '\0') { tmp_len = strlen(&str[i]); if(tmp_len <= 3 && tmp_len >= 2) { count = 0; for(j = i; j < i + tmp_len; j++) { //此处易错:忘记加i if(str[j] >= 'A' && str[j] <= 'Z') { count++; } } if((count == 1) && (str[i] >= 'A' && str[i] <= 'Z')) { switch (str[i]) { case 'A': x -= atoi(&str[i+1]); break; case 'D': x += atoi(&str[i+1]); break; case 'W': y += atoi(&str[i+1]); break; case 'S': y -= atoi(&str[i+1]); break; default: break; } } } i+= tmp_len - 1; } } printf("%d,%d\n", x, y); } return 0; }
int move_coord(char *str, int *x, int *y) { if((str[1] < '0' || str[1] > '9') || (str[2] < '0' || str[2] > '9')) return 0; else return (str[1] - '0') *10 + (str[2] - '0'); } void process_coord(char *str, int *x, int *y) { switch (str[0]) { case 'W': *y += move_coord(str, x, y); break; case 'A': *x -= move_coord(str, x, y); break; case 'S': *y -= move_coord(str, x, y); break; case 'D': *x += move_coord(str, x, y); break; default: break; } return; } int main() { int x = 0, y = 0; char str[10001]; char substr[4]; char *p, *q; int len = 0; memset(str, 0, sizeof(str)); memset(substr, 0, sizeof(substr)); scanf("%s", str); p = str; while(*p != 0) { q = p; while(*p != ';') { p++; } len = p - q; if(len != 3) { p++; continue; } memcpy(substr, q, len); process_coord(substr, &x, &y); p++; } printf("%d,%d\n", x, y); return 0; }
// 分享一下我自己的解法 #include <stdio.h> #include <string.h> int main() { long int x = 0; long int y = 0; char str[10001] = {0}; scanf("%s", str); int len = strlen(str); int pointer = 0; int probe = 0; int OkFlag = 1; int Direction = 0; // A: 1; D: 2; W: 3; S: 4; int TempTen = 0; // 十位数 int TempOne = 0; // 个位数 while(pointer < len){ OkFlag = 1; switch(str[pointer]){ case 'A': Direction = 1; break; case 'D': Direction = 2; break; case 'W': Direction = 3; break; case 'S': Direction = 4; break; default: OkFlag = 0; } if(OkFlag){ probe++; if(str[probe]<='9' && str[probe]>='0'){ TempTen = str[probe] - '0'; probe++; if(str[probe]<='9' && str[probe]>='0'){ TempOne = str[probe] - '0'; probe++; if(str[probe]==';'){ switch(Direction){ case 1: x -= 10*TempTen + TempOne; break; case 2: x += 10*TempTen + TempOne; break; case 3: y += 10*TempTen + TempOne; break; case 4: y -= 10*TempTen + TempOne; break; } }else{ OkFlag = 0; } }else if(str[probe]==';'){ switch(Direction){ case 1: x -= TempTen; break; case 2: x += TempTen; break; case 3: y += TempTen; break; case 4: y -= TempTen; break; } }else{ OkFlag = 0; } }else{ OkFlag = 0; } } while(str[pointer++] != ';'){} probe = pointer; } printf("%ld,%ld", x, y); }
#include <stdio.h> #include <string.h> int judge(char *str) { int num=0; int len=strlen(str); for(int i=1;i<len;i++)//i=0对应字母,i=1开始读入坐标长度 { if(str[i]>='0'&&str[i]<='9') { num=num*10+(str[i]-'0'); } else { return 0;//非法不输出 } } return num; } int main() { int x=0, y=0; char str[10001]; char str_tmp[10001][10];//每个';'进行分割,存储被';'分开的指令 scanf("%s",str); int len=strlen(str); int j=0;//记录单个指令长度 int k=0;//记录总共指令个数(包含非法的) for(int i=0;i<len;i++) { if(str[i]!=';') { str_tmp[k][j++]=str[i]; } else { j=0; k++; } } for(int i=0;i<=k;i++) { if(str_tmp[i][0]=='A') { x-=judge(str_tmp[i]); } else if(str_tmp[i][0]=='D') { x+=judge(str_tmp[i]); } else if(str_tmp[i][0]=='W') { y+=judge(str_tmp[i]); } else if(str_tmp[i][0]=='S') { y-=judge(str_tmp[i]); } } printf("%d,%d",x,y); return 0; }