mxqz 一道水题
  • 板块P2206 奶牛芭蕾
  • 楼主_Kouki_
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/3/5 23:01
  • 上次更新2023/10/28 07:11:23
查看原帖
mxqz 一道水题
364847
_Kouki_楼主2022/3/5 23:01
#include<bits/stdc++.h>//万能头
using namespace std;
int n;//操作数
int Xmax=1,Xmin=0,Ymax=0,Ymin=-1;//上,下,左,右,的边界
string s;
struct node//脚的坐标
{
    int x,y;
}FR,FL,RR,RL;//前右脚(Front right foot)前左脚(Front left foot)后右脚(Rear right foot)后左脚(Rear left foot)
void COW()//奶牛的初始化
{
    FR.x=1,FR.y=0;
    FL.x=0,FL.y=0;
    RR.x=1,RR.y=-1;
    RL.x=0,RL.y=-1;
}
bool same(node a,node b)
{
    if(a.x==b.x&&a.y==b.y) return true;
    return false;
}
bool check()
{
    if(same(FL,FR)||same(FL,RL)||same(FL,RR)||same(FR,RL)||same(FR,RR)||same(RL,RR)) return true;
    return false;
}
void FB()//移动
{
    if(s[0]=='F')//前进
        {
            if(s[1]=='F')//前脚
            {
                if(s[2]=='L')
                /*前左脚*/{FL.y-=1;Ymin=min(Ymin,FL.y);}else
                /*前右脚*/{FR.y-=1;Ymin=min(Ymin,FR.y);}
            }else//后脚
            {
                if(s[2]=='L')
                /*后左脚*/{RL.y-=1;Ymin=min(Ymin,RL.y);}else
                /*后右脚*/{RR.y-=1;Ymin=min(Ymin,RR.y);}
            }
        }else//后退
        if(s[0]=='B');
        {
            if(s[1]=='F')//前脚
            {
                if(s[2]=='L')
                /*前左脚*/{FL.y+=1;Ymax=max(Ymax,FL.y);}else
                /*前右脚*/{FR.y+=1;Ymax=max(Ymax,FR.y);}
            }else
            {
                if(s[2]=='L')
                /*后左脚*/{RL.y+=1;Ymax=max(Ymax,RL.y);}else
                /*后右脚*/{RR.y+=1;Ymax=max(Ymax,RR.y);}
            }
        }
}
void LR()//旋转
{ 
    //LFT示意图
    // .. .. .. ..
    // .. FL .. ..
    // .. FR .. ..
    // RR .. LR ..
    // -----------
    // .. .. .. LR
    // .. FL FR ..
    // .. .. .. RR
    // .. .. .. ..
    //
    if(s[0]=='L')//左转
    {
        if(s[1]=='F')//前脚
        {
            if(s[2]=='L')
            /*前左脚*/
            {
                FL.x=FL.x;
                FL.y=FL.y;
                
                FR.x=FL.x+(FL.y-FR.y);
                FR.y=FL.y+(FL.x-FR.x);
                
                RR.x=FL.x+(FL.y-RR.y);
                RR.y=FL.y+(FL.x-RR.x);
                
                RL.x=FL.x+(FL.y-RL.y);
                RL.y=FL.y+(FL.x-RL.x);
            }else
            /*前右脚*/
            {
                FL.x=FR.x+(FR.y-FL.y);
                FL.y=FR.y+(FR.x-FL.x);
                
                FR.x=FR.x;
                FR.y=FR.y;
                
                RR.x=FR.x+(FR.y-RR.y);
                RR.y=FR.y+(FR.x-RR.x);
                
                RL.x=FR.x+(FR.y-RL.y);
                RL.y=FR.y+(FR.x-RL.x);
            }
        }else/*后脚*/
        {
            if(s[2]=='L')
            /*后左脚*/
            {
                FL.x=RL.x+(RL.y-FL.y);
                FL.y=RL.y+(RL.x-FL.x);
                
                FR.x=RL.x+(RL.y-FR.y);
                FR.y=RL.y+(RL.x-FR.x);
                
                RR.x=RL.x+(RL.y-RR.y);
                RR.y=RL.y+(RL.x-RR.x);
                
                RL.x=RL.x;
                RL.y=RL.y;
            }else
            /*后右脚*/
            {
                FL.x=RR.x+(RR.y-FL.y);
                FL.y=RR.y+(RR.x-FL.x);
                
                FR.x=RR.x+(RR.y-FR.y);
                FR.y=RR.y+(RR.x-FR.x);
                
                RR.x=RR.x;
                RR.y=RR.y;
                
                RL.x=RR.x+(RR.y-RL.y);
                RL.y=RR.y+(RR.x-RL.x);
            }
        }
    }else//右转
    {
        if(s[1]=='F')//前脚
        {
            if(s[2]=='L')
            /*前左脚*/
            {
                FL.x=FL.x;
                FL.y=FL.y;
                
                FR.x=FL.x-(FL.y-FR.y);
                FR.y=FL.y-(FL.x-FR.x);
                
                RR.x=FL.x-(FL.y-RR.y);
                RR.y=FL.y-(FL.x-RR.x);
                
                RL.x=FL.x-(FL.y-RL.y);
                RL.y=FL.y-(FL.x-RL.x);
            }else
            /*前右脚*/
            {
                FL.x=FR.x-(FR.y-FL.y);
                FL.y=FR.y-(FR.x-FL.x);
                
                FR.x=FR.x;
                FR.y=FR.y;
                
                RR.x=FR.x-(FR.y-RR.y);
                RR.y=FR.y-(FR.x-RR.x);
                
                RL.x=FR.x-(FR.y-RL.y);
                RL.y=FR.y-(FR.x-RL.x);
            }
        }else/*后脚*/
        {
            if(s[2]=='L')
            /*后左脚*/
            {
                FL.x=RL.x-(RL.y-FL.y);
                FL.y=RL.y-(RL.x-FL.x);
                
                FR.x=RL.x-(RL.y-FR.y);
                FR.y=RL.y-(RL.x-FR.x);
                
                RR.x=RL.x-(RL.y-RR.y);
                RR.y=RL.y-(RL.x-RR.x);
                
                RL.x=RL.x;
                RL.y=RL.y;
            }else
            /*后右脚*/
            {
                FL.x=RR.x-(RR.y-FL.y);
                FL.y=RR.y-(RR.x-FL.x);
                
                FR.x=RR.x-(RR.y-FR.y);
                FR.y=RR.y-(RR.x-FR.x);
                
                RR.x=RR.x;
                RR.y=RR.y;
                
                RL.x=RR.x-(RR.y-RL.y);
                RL.y=RR.y-(RR.x-RL.x);
            }
        }
    }
    Xmax=max(Xmax,FL.x);
    Xmax=max(Xmax,FR.x);
    Xmax=max(Xmax,RL.x);
    Xmax=max(Xmax,RR.x);
    Xmin=min(Xmin,FL.x);
    Xmin=min(Xmin,FR.x);
    Xmin=min(Xmin,RL.x);
    Xmin=min(Xmin,RR.x);

    Ymax=max(Ymax,FL.y);
    Ymax=max(Ymax,FR.y);
    Ymax=max(Ymax,RL.y);
    Ymax=max(Ymax,RR.y);
    Ymin=min(Ymin,FL.y);
    Ymin=min(Ymin,FR.y);
    Ymin=min(Ymin,RL.y);
    Ymin=min(Ymin,RR.y);
}
int main()
{
    COW();//奶牛的初始化
    scanf("%d",&n);//读入
    for(int i=1;i<=n;i++)
    {
        cin>>s;
        /*再回顾题目
        "F" - 向前 
        "B" - 向后 
        "R" - 向右 
        "L" - 向左
        */
        FB();
        LR();
        // if(check())
        // {
        //     printf("-1");
        //     return 0;
        // }
    }
    int XX=Xmax-Xmin+1,YY=Ymax-Ymin+1;
    int BC=max(XX,YY);
    printf("%d",BC*BC);
   int tt;cin>>tt;
}

2022/3/5 23:01
加载中...