Bootstrap

洛谷 CF748C Santa Claus and Robot 题解

题目大意

有一个机器人在网格上行走,它会沿着网格的线移动,求它最少要沿着最短路径到达几个点才能行完所有路程。

思路

最少的话就要让每条最短路径尽可能长,但由于路径是最短的,所以在每条路径中不能出现相反的行走路线,所以在每一个最短路径中,不可能同时出先 LRUD

可以对机器人每次行走的方向进行判断,如果出现了相反方向,就将答案加 1 1 1,并清空之前走的方向,反之则继续判断。

Code

#include<iostream>
#include<cstring>
using namespace std;
bool vis[4];//储存已出现的行走方向
bool chk(char ch) {//判断是否有相反方向
	return (ch=='R'&&vis[2])||(ch=='U'&&vis[3])||(ch=='L'&&vis[0])||(ch=='D'&&vis[1]);
}
void visit(char ch) {//添加方向
	if(ch=='R') vis[0]=true;
	else if(ch=='U') vis[1]=true;
	else if(ch=='L') vis[2]=true;
	else vis[3]=true;
}
signed main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,ans=1;//答案初始要为1
	string str;
	cin>>n>>str;
	for(int i=0;i<n;++i) {
		if(chk(str[i])) {//如果有相反的
			++ans;
			memset(vis,false,sizeof(vis));//清空之前的数据
		}
		visit(str[i]);//添加这个方向
	}
	cout<<ans;
	return 0;
}
;