按照常规方法使用char*指针结果紫了两个checkpoint
查看原帖
按照常规方法使用char*指针结果紫了两个checkpoint
855093
0x00AC3375楼主2023/7/19 00:17

数组够长 针对出界也有特判结果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;
}
2023/7/19 00:17
加载中...