zoukankan      html  css  js  c++  java
  • 练习题 奶牛跳舞

    奶牛Bessie在一个矩形网格的舞台上跳舞。每一格是一个1 x 1的单元方格。Bessie的四只脚缩写如下:
    FR: 右前脚
    FL: 左前脚
    RR: 右后脚
    RL: 左后脚


    下面的初始状态表示Bessie头朝北方站在相邻的4个方格里,形成一个正方形:
    FL FR
    RL RR


    Bessie跳舞一共有N(1 <= N <= 1000)个指令,每条指令要求Bessie的一只脚移动一格,或者是以一只脚为支点,顺时针旋转90度。


    移动指令是3字符的,前2个字符描述哪一只脚,第3个字符描述移动方向:(F = 前进, B = 后退, R = 右, L = 左)
    例如,"FRF"表示右前脚向前移一格。"RLR"表示左后脚向右移一格。注意,移动的方向与Bessie的头朝向有关。
    旋转指令也是3字符的,前2个字符描述哪一只脚,第3个字符固定为'P'。
    例如,"FRP"表示以右前脚为支点,顺时针旋转90度。如果她旋转前站成这样(头朝北):
    .. .. .. 
    .. .. FR 
    .. FL .. 
    .. RL RR 


    旋转后将站成这样(头朝东):
    RL FL .. 
    RR .. FR 
    .. .. ..  
    .. .. ..


    给出N条指令,求一个最小的矩形区域作为舞台,使得Bessie在上面跳舞,任何时刻每条脚都在舞台上。
    如果某个时刻,Bessie的两条脚需要站在同一个格子里,停止跳舞,输出-1
    除此情况外,其他任何的四条脚的状态(例如后脚移动到前脚之前)都是合法的。


    INPUT FORMAT:


    第1行: 一个整数N
    接下来N行,每行一个指令


    SAMPLE INPUT (file ballet.in):


    3
    FRF
    FRP
    RLB




    OUTPUT FORMAT:
    第1行:一个整数,表示最小的矩形的面积。


    SAMPLE OUTPUT (file ballet.out):


    16


    OUTPUT DETAILS:


    Bessie 需要一个 4 x 4的舞台,它的移动过程为:


    .. .. .. .. 
    .. .. .. .. (facing north)
    .. .. FL FR 
    .. .. RL RR 


    After FRF:


    .. .. .. .. 
    .. .. .. FR (facing north)
    .. .. FL .. 
    .. .. RL RR 


    After FRP:


    .. RL FL .. 
    .. RR .. FR (facing east)
    .. .. .. .. 
    .. .. .. .. 


    After RLB:


    RL .. FL ..
    .. RR .. FR (facing east)
    .. .. .. ..

    .. .. .. ..


    这道题刚开始看时,只想到只需上下左右动就行了,可写到一半时发现,旋转时,需要考虑头的方向,可见,这道题很ZZ


    开始想用数组来存储踩过的点,再搜出上下左右四个点,结果超时………………


    想了一晚上,后经同学启发,发现可以,边跳边计算舞台最大长宽,终于,AC代码出炉了!!


    顺便吐槽一下,这奶牛也是个长腿欧巴,脚跨得好远,呵呵…………



    代码如下:

    <span style="background-color: rgb(255, 255, 153);">#include<cstdio>
    #include<cstring>
    int xm[4][4]={{-1,1,0,0},{0,0,-1,1},{1,-1,0,0},{0,0,1,-1}},ym[4][4]={{0,0,-1,1},{1,-1,0,0},{0,0,1,-1},{-1,1,0,0}};
    int cf[4][2]={{0,0},{0,1},{1,0},{1,1}};
    int xy[4]={0,0,1,1};
    char c[3];
    int f;
    void work(int x,int t)
    {
    	int p,q;
    	if(c[2]=='F')
    	{
    		cf[x][0]+=xm[t][0];
    		cf[x][1]+=ym[t][0];
    		if(cf[x][0]>xy[2])
    			xy[2]=cf[x][0];
    		if(cf[x][0]<xy[0])
    			xy[0]=cf[x][0];
    		if(cf[x][1]<xy[1])
    			xy[1]=cf[x][1];
    		if(cf[x][1]>xy[3])
    			xy[3]=cf[x][1];
    	}
    	if(c[2]=='B')
    	{
    		cf[x][0]+=xm[t][1];
    		cf[x][1]+=ym[t][1];
    		if(cf[x][0]>xy[2])
    			xy[2]=cf[x][0];
    		if(cf[x][0]<xy[0])
    			xy[0]=cf[x][0];
    		if(cf[x][1]<xy[1])
    			xy[1]=cf[x][1];
    		if(cf[x][1]>xy[3])
    			xy[3]=cf[x][1];
    	}
    	if(c[2]=='L')
    	{
    		cf[x][0]+=xm[t][2];
    		cf[x][1]+=ym[t][2];
    		if(cf[x][0]>xy[2])
    			xy[2]=cf[x][0];
    		if(cf[x][0]<xy[0])
    			xy[0]=cf[x][0];
    		if(cf[x][1]<xy[1])
    			xy[1]=cf[x][1];
    		if(cf[x][1]>xy[3])
    			xy[3]=cf[x][1];
    	}
    	if(c[2]=='R')
    	{
    		cf[x][0]+=xm[t][3];
    		cf[x][1]+=ym[t][3];
    		if(cf[x][0]>xy[2])
    			xy[2]=cf[x][0];
    		if(cf[x][0]<xy[0])
    			xy[0]=cf[x][0];
    		if(cf[x][1]<xy[1])
    			xy[1]=cf[x][1];
    		if(cf[x][1]>xy[3])
    			xy[3]=cf[x][1];
    	}
    	if(c[2]=='P')
    	{
    		for(int i=0;i<4;i++)
    		{
    			p=cf[x][0]+cf[i][1]-cf[x][1];
    			q=cf[x][1]-cf[i][0]+cf[x][0];
    			cf[i][0]=p;
    			cf[i][1]=q;
    			if(cf[i][0]>xy[2])
    				xy[2]=cf[i][0];
    			if(cf[i][0]<xy[0])
    				xy[0]=cf[i][0];
    			if(cf[i][1]<xy[1])
    				xy[1]=cf[i][1];
    			if(cf[i][1]>xy[3])
    				xy[3]=cf[i][1];
    		}
    		f++;
    		f%=4;
    	}
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	while(n)
    	{
    		n--;
    		scanf("%s",c);
    		if(c[0]=='F'&&c[1]=='L')
    			work(0,f);
    		if(c[0]=='F'&&c[1]=='R')
    			work(1,f);
    		if(c[0]=='R'&&c[1]=='L')
    			work(2,f);
    		if(c[0]=='R'&&c[1]=='R')
    			work(3,f);
    		if((cf[0][0]==cf[1][0]&&cf[0][1]==cf[1][1])||(cf[0][0]==cf[2][0]&&cf[0][1]==cf[2][1])||(cf[0][0]==cf[3][0]&&cf[0][1]==cf[3][1])||(cf[1][0]==cf[2][0]&&cf[1][1]==cf[2][1])||(cf[1][0]==cf[3][0]&&cf[1][1]==cf[3][1])||(cf[2][0]==cf[3][0]&&cf[2][1]==cf[3][1]))
    		{
    			printf("-1");
    			return 0;
    		}
    	}
    	printf("%d",(xy[2]-xy[0]+1)*(xy[3]-xy[1]+1));
    }</span>
  • 相关阅读:
    安全传输平台项目扩展——keymngserver重构-硬件扩展
    安全传输平台项目扩展——C复习-C++复习-keymngclient重构
    安全传输平台项目——客户端代码移植-项目模块总结
    安全传输平台项目——配置管理终端-读写数据库
    根号分治刷题记录
    使用netsh命令来管理IP安全策略
    关于make_shared无法访问非公有构造函数的解决方法
    两两交换链表中的节点-递归解法
    Spring 的 AOP 简介
    Spring IOC和DI 注解开发
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002577.html
Copyright © 2011-2022 走看看