题目大意
有一个机器人在网格上行走,它会沿着网格的线移动,求它最少要沿着最短路径到达几个点才能行完所有路程。
思路
最少的话就要让每条最短路径尽可能长,但由于路径是最短的,所以在每条路径中不能出现相反的行走路线,所以在每一个最短路径中,不可能同时出先 L
或 R
、U
或 D
。
可以对机器人每次行走的方向进行判断,如果出现了相反方向,就将答案加 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;
}