题意:给出t组样例,每组样例输入r和c代表空间的长和宽。给出机器人的行动顺序,机器人不能走出范围,求出尽可能少的跳过的步骤。
思路:典型的模拟,重点在于起点未定。可以记录机器人分别在四个方向走出的最大值。当最右-最左>c时,多出来的那一部分必定要跳过,同理上下。
for(int i=0;i<strlen(s);i++){
x=nowx,y=nowy;//nowx代表x的当前坐标,同理nowy;
if(s[i]=='^') y++;
if(s[i]=='>') x++;
if(s[i]=='<') x--;
if(s[i]=='v') y--;
if((max(maxx,x)-min(x,minx)>=c)||((max(maxy,y))-min(y,miny)>=r)) skip++;
else{
maxx=max(maxx,x);
maxy=max(maxy,y);
minx=min(minx,x);
miny=min(miny,y);
nowx=x,nowy=y;//在走完这一步之后没有冲突,那就更新起点。
}
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int r,c;
scanf("%d%d",&r,&c);
char s[200007];
scanf("%s",s);
// printf("%s",s);
int x=0,y=0,skip=0,nowx=0,nowy=0,maxx=0,minx=0,maxy=0,miny=0;
for(int i=0;i<strlen(s);i++){
x=nowx,y=nowy;
if(s[i]=='^') y++;
if(s[i]=='>') x++;
if(s[i]=='<') x--;
if(s[i]=='v') y--;
if((max(maxx,x)-min(x,minx)>=c)||((max(maxy,y))-min(y,miny)>=r)) skip++;
else{
maxx=max(maxx,x);
maxy=max(maxy,y);
minx=min(minx,x);
miny=min(miny,y);
nowx=x,nowy=y;
}
}
printf("%d\n",skip);
}
return 0;
}