在一行上输入一个长度
,由大写字母、数字和分号(
)构成的字符串
,代表输入的指令序列。保证字符串中至少存在一个
,且末尾一定为
。
在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。
A10;S20;W10;D30;X;A1A;B10A11;;A10;
10,-10
对于这个样例,我们模拟小人的移动过程:
第一个指令
是合法的,向左移动
个单位,到达
点;
第二个指令
是合法的,向下移动
个单位,到达
点;
第三个指令
是合法的,向上移动
个单位,到达
点;
第四个指令
是合法的,向右移动
个单位,到达
点;
第五个指令
不合法,跳过;
第六个指令
不合法,跳过;
第七个指令
不合法,跳过;
第八个指令
不合法,跳过;
第九个指令
是合法的,向左移动
个单位,到达
点。
ABC;AKL;DA1;D001;W023;A100;S00;
0,0
在这个样例中,全部指令均不合法,因此小人不移动。
A00;S01;W2;
0,1
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-15 更新题面,新增几组hack数据(暂未进行重测)。
2. 2024-12-16 更新题面。
#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;
}