数组够长 针对出界也有特判结果RE了
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//棋盘
char road[1001000]={0};
//玩家所在的位置, 用char类型的指针表示
char* player;
//掷骰次数、掷出的点数和走出的步数
int n, point, step = 0;
//一次掷骰的结果
void action(int _point)
{
//使用指针的偏移运算来模拟棋子的移动
player += _point;
step += _point;
//连续遇到3个以上的">",就能获得奖励, 一直前进直到遇到第一个不是">"的字符或者到达终点
if (*player == '>' && *(player + 1) == '>' && *(player + 2) == '>')
{
while (*player == '>' && *(player + 1) != '\0')
{
step += 1;
player += 1;
}
}
//连续遇到3个以上的"*", 就要遭受惩罚, 要一路回退若干步(步数等于星号的数量)或者到达起点
else if (*player == '*' && *(player + 1) == '*' && *(player + 2) == '*')
{
//统计后续星号的数量
int cnt = 0;
while (*(player + cnt) == '*') cnt += 1;
//如果退到了起点就不能继续后退
if (cnt >= step)
{
player = road + 1;
step = 1;
return;
}
else//后退相应的步数
{
player -= cnt;
step -= cnt;
return;
}
}
return;
}
//输入操作
void input(void)
{
cin >> n;
for (int i = 1; i <= n; i += 1)
{
cin >> point;//From 1 to 6 point(s)
action(point);
}
//使用指针减去road的首地址就是走出的步数, 字符串长度减去步数就是距离终点的距离
printf("%d %d\n", step, strlen(road + 1) - step);
return;
}
int main()
{
road[0]==-1;
player = road + 0;
//第0格空出来是起点(设置为-1), 第一格才是第一个字符
scanf("%s", road + 1);
input();
return 0;
}