csu1510(规律)

来源:互联网 发布:浙江儿童dna数据库利弊 编辑:程序博客网 时间:2024/06/05 15:33

题意:从(0,0)开始在坐标上移动,问x,y分别可以移动到的位置的最小值和最大值,有四种移动方式:

F:在当前面对的方向移动一格,一共四个方向,自然是坐标轴的上下左右四个方向,这代表着每次只有x变化或者只有y变化

L:当前方向向左转90度,比如面对着x轴正方向转为y轴正方向

R:向右转90度

?:这个代表着这个命令由你定,你可以执行上述三个命令中任何一个,当然为了得到极值选哪个命令就是这道题的关键了



一开始用了dfs做,超时,想想有1000个字符,自然会超时

隔了一天想到其实当前在处理某个字符,并不用考虑除了前一个字符之外的字符是什么选择

假设四个方向分别用0,1,2,3代替

假设现在是求x的最大值

例如对于第一个字符是?,第二个字符L,那么第二个字符只考虑可以由第一个字符得到什么,如果第一个字符可以是0方向,那么第二个字符就可以是3方向了,如果第一个字符的0方向有值a,那么第二个字符由第一个字符左转得到,自然值就为a

如果当前处理的字符为?,那就是三种选择,比如对于0方向,上个字符0,1,3方向有值,那么x_next_max[0]=max(x[0],x[1],x[2])

我一开始觉得很头痛的是处理问号的时候怎么判断对后面的影响来获得最大值,其实只要记录当前每个方向是否可以成立就好了


#include <iostream>

#include <stdio.h>

#include <string.h>

#include <algorithm>

#include <math.h>

#define IMAX 1000005

using namespacestd;

char ch[1005];

int len;

//int xin[4],xax[4],yin[4],yax[4];

int max(int a,int b,int c)

{

    if(a<b)

        a=b;

    if(a>c)

        return a;

    return c;

}

int min(int a,int b,int c)

{

    if(a>b)

        a=b;

    if(a<c)

        return a;

    return c;

}

void chang(int *s,int f)

{

    if(f==2)

    {

        int tep=s[0];

        s[0]=s[1];

        s[1]=s[2];

        s[2]=s[3];

        s[3]=tep;

    }

    if(f==1)

    {

        int tep=s[0];

        s[0]=s[3];

        s[3]=s[2];

        s[2]=s[1];

        s[1]=tep;

    }

}

int main()

{

    int tt=1;

    while(scanf("%s",ch)!=EOF)

    {

        len=strlen(ch);

        int xax[4]={0,-IMAX,-IMAX,-IMAX};

        int xin[4]={0,IMAX,IMAX,IMAX};

        int yax[4]={0,-IMAX,-IMAX,-IMAX};

        int yin[4]={0,IMAX,IMAX,IMAX};

        int t[4];

        for(int i=0;i<len;i++)

        {

            if(ch[i]=='L')

            {

                chang(xax,1);

                chang(xin,1);

                chang(yax,1);

                chang(yin,1);

            }

            elseif(ch[i]=='R')

            {

                chang(xax,2);

                chang(xin,2);

                chang(yax,2);

                chang(yin,2);

            }

            elseif(ch[i]=='F')

            {

                if(xax[0]!=-IMAX)

                    xax[0]++;

                if(xax[2]!=-IMAX)

                    xax[2]--;

                

                if(xin[0]!=IMAX)

                    xin[0]++;

                if(xin[2]!=IMAX)

                    xin[2]--;

                

                if(yax[1]!=-IMAX)

                    yax[1]++;

                if(yax[3]!=-IMAX)

                    yax[3]--;

                

                if(yin[1]!=IMAX)

                    yin[1]++;

                if(yin[3]!=IMAX)

                    yin[3]--;

            }

            else

            {

                

                t[0]=max(xax[0]+1,xax[1],xax[3]);

                t[1]=max(xax[1],xax[0],xax[2]);

                t[3]=max(xax[3],xax[0],xax[2]);

                t[2]=max(xax[2]-1,xax[1],xax[3]);

                memcpy(xax,t,16);

                

                if(xin[2]!=IMAX)

                    t[2]=min(xin[2]-1,xin[1],xin[3]);

                else

                    t[2]=min(xin[2],xin[1],xin[3]);

                t[1]=min(xin[1],xin[0],xin[2]);

                t[3]=min(xin[3],xin[0],xin[2]);

                t[0]=min(xin[0]+1,xin[1],xin[3]);

                memcpy(xin,t,16);

                

                if(yax[1]!=-IMAX)

                    t[1]=max(yax[1]+1,yax[0],yax[2]);

                else

                    t[1]=max(yax[1],yax[0],yax[2]);

                t[0]=max(yax[0],yax[1],yax[3]);

                t[2]=max(yax[2],yax[1],yax[3]);

                t[3]=max(yax[3]-1,yax[0],yax[2]);

                memcpy(yax,t,16);

                

                if(yin[3]!=IMAX)

                    t[3]=min(yin[3]-1,yin[0],yin[2]);

                else

                    t[3]=min(yin[3],yin[0],yin[2]);

                t[0]=min(yin[0],yin[1],yin[3]);

                t[2]=min(yin[2],yin[1],yin[3]);

                t[1]=min(yin[1]+1,yin[0],yin[2]);

                memcpy(yin,t,16);

            }

            /*printf("%d %d %d %d\n",xin[0],xin[1],xin[2],xin[3]);

            printf("%d %d %d %d\n",xax[0],xax[1],xax[2],xax[3]);

            printf("%d %d %d %d\n",yin[0],yin[1],yin[2],yin[3]);

            printf("%d %d %d %d\n",yax[0],yax[1],yax[2],yax[3]);*/

        }

        printf("Case %d: ",tt);

        tt++;

        xax[0]=max(max(xax[1],xax[2],xax[2]),xax[0],xax[3]);

        xin[2]=min(min(xin[0],xin[1],xin[1]),xin[3],xin[2]);

        yin[3]=min(min(yin[0],yin[1],yin[1]),yin[2],yin[3]);

        yax[1]=max(max(yax[0],yax[2],yax[2]),yax[3],yax[1]);

        printf("%d %d %d %d\n",xin[2],xax[0],yin[3],yax[1]);

    }

    return0;

}

/*********************

若是真的比赛我这种第二天才想出来的肯定就gg了,希望天赐我一些聪明才智



原创粉丝点击