csu1510 Happy Robot 递推

题目链接:

csu1510





解题思路:

要求解四个值x_min,x_max,y_min,y_max

首先考虑x_min怎样得到:由于机器人最后有能够面向四个方向(E,W,N,S),我们能够用一个数组a[4]来存机器人面向4个方向时x的值

a[0]: x+,a[1]:x-。a[2]:y+,a[3],y-;

仅仅要求出a[4]最后比較出最小值,即为x_min

而求a[4]的关键在于运行?命令时怎样得到最优解:

a[x]=Min(左转,右转,前进);

即 a[0]=Min(a[2],a[3],a[0]+1);

同理得到a[1],a[2],a[3]



代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 9999
using namespace std;
char str[1050];

int Min(int a,int b,int c)
{
    if(a>b)
        a=b;
    if(a>c)
        a=c;
    return a;
}

int Max(int a,int b,int c)
{
    if(a<b)
        a=b;
    if(a<c)
        a=c;
    return a;
}

void change(int* t,int dir)
{
    int tt=t[0];
    if(dir)
    {
        t[0]=t[3];
        t[3]=t[1];
        t[1]=t[2];
        t[2]=tt;
    }
    else
    {
        t[0]=t[2];
        t[2]=t[1];
        t[1]=t[3];
        t[3]=tt;
    }
}

int main()
{
    int len;
    int t[4];
    int Case=1;
    while(~scanf("%s",str))
    {
        int a[4]= {0,-INF,-INF,-INF};
        int b[4]= {0,INF,INF,INF};
        int c[4]= {0,-INF,-INF,-INF};
        int d[4]= {0,INF,INF,INF};
        len=strlen(str);
        for(int i=0; i<len; i++)
        {
            if(str[i]=='F')
            {
                a[0]++,a[1]--;
                b[0]++,b[1]--;
                c[2]++,c[3]--;
                d[2]++,d[3]--;
            }
            else if(str[i]=='L')
            {
                change(a,1);
                change(b,1);
                change(c,1);
                change(d,1);
            }
            else if(str[i]=='R')
            {
                change(a,0);
                change(b,0);
                change(c,0);
                change(d,0);
            }
            else
            {
                t[0]=Max(a[0]+1,a[2],a[3]);
                t[1]=Max(a[1]-1,a[2],a[3]);
                t[2]=Max(a[0],a[1],a[2]);
                t[3]=Max(a[0],a[1],a[3]);
                memcpy(a,t,16);
                t[0]=Min(b[0]+1,b[2],b[3]);
                t[1]=Min(b[1]-1,b[2],b[3]);
                t[2]=Min(b[0],b[1],b[2]);
                t[3]=Min(b[0],b[1],b[3]);
                memcpy(b,t,16);
                t[0]=Max(c[0],c[2],c[3]);
                t[1]=Max(c[1],c[2],c[3]);
                t[2]=Max(c[0],c[1],c[2]+1);
                t[3]=Max(c[0],c[1],c[3]-1);
                memcpy(c,t,16);
                t[0]=Min(d[0],d[2],d[3]);
                t[1]=Min(d[1],d[2],d[3]);
                t[2]=Min(d[0],d[1],d[2]+1);
                t[3]=Min(d[0],d[1],d[3]-1);
                memcpy(d,t,16);
            }
        }
        t[0]=max(Max(a[0],a[1],a[2]),a[3]);
        t[1]=min(Min(b[0],b[1],b[2]),b[3]); 
        t[2]=max(Max(c[0],c[1],c[2]),c[3]);
        t[3]=min(Min(d[0],d[1],d[2]),d[3]);
        printf("Case %d: %d %d %d %d\n",Case++,t[1],t[0],t[3],t[2]);
    }
    return 0;
}




posted on 2017-08-11 11:36  blfbuaa  阅读(140)  评论(0编辑  收藏  举报