gym101102I(模拟)

来源:互联网 发布:正当防卫3内存优化补丁 编辑:程序博客网 时间:2024/06/06 09:32

题意:给出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;}