zoukankan      html  css  js  c++  java
  • 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
    ",Case++,t[1],t[0],t[3],t[2]);
        }
        return 0;
    }
    




  • 相关阅读:
    批量创建账号脚本
    shell 批量创建_备份 mysql 数据库 表
    优化chkconfig
    cut 命令
    Shell for 循环
    while 读取文件内容
    生成随机数
    linux 资源管理
    shell 脚本后台运行知识
    while 语句
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7345100.html
Copyright © 2011-2022 走看看