练习题 奶牛跳舞

奶牛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>
原文地址:https://www.cnblogs.com/Darknesses/p/12002577.html