Jury Jeopardy

题目买描述:http://192.168.49.228/upload/file/20180717/20180717143746_97767.pdf

样例输入

3
FFRBLF
FFRFRBRFBFRBRFLF
FRLFFFLBRFFFRFFFRFRFBRFLBRFRLFLFFR

样例输出

3
4 4
####
...#
##.#
####
7 5
#####
...##
##.##
#...#
##.##
##.##
#####
7 7
#######
#...#.#
#.#...#
#.#.###
..###.#
#.....#
#######

题目大意:按着当前方向,F表示直走,B表示后退,L表示向左转,R表示向右转,给你一列由F,B,L,R组成的字符

要求输出,行走方案,在一个矩形中,只能从左边或者右边为入口,被#全包围,初始站在入口处,朝东。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int vis[110][110],flag[110][110]; 
char s[10010];
int dir[4][2]={-1,0,1,0,0,1,0,-1};  
int main()
{	int f,l,i,j,temp,x,y,x1,y1,x2;
	scanf("%d",&f);
	printf("%d\n",f);
	while(f--){
		memset(s,'\0',sizeof(s));
		scanf("%s",s);
		
		l=strlen(s);
		memset(vis,0,sizeof(vis));
		memset(flag,0,sizeof(flag));
		x1=0; y1=0;
		x2=0;  
		vis[0][0]=1; //使用(0,0)处为起始点,因为下标可能会出现负数,所以使用了两个标记数组
                    //  为了更方便可以使用(200,200)为起始点,使用一个标记数组即可完成
		
		temp=2;
		x=0;  y=0;
		
		for(i=0;i<l;i++){
			if(s[i]=='B'){
				if(temp==0)
					temp=1;
				else if(temp==1)
					temp=0;
				else if(temp==2)
					temp=3;
				else
					temp=2;
			}
			else if(s[i]=='L'){
				if(temp==0)
					temp=3;
				else if(temp==1)
					temp=2;
				else if(temp==2)
					temp=0;
				else
					temp=1;
			}
			else if(s[i]=='R'){
				if(temp==0)
					temp=2;
				else if(temp==1)
					temp=3;
				else if(temp==2)
					temp=1;
				else
					temp=0;
			}
			x=x+dir[temp][0];
			y=y+dir[temp][1];
			
			if(x<0){
				flag[-x][y]=1;
				x1=max(x1,-x);
				y1=max(y1,y);
			}
			else{
				vis[x][y]=1;
				x2=max(x2,x);
				y1=max(y1,y);
			}
		}
		
		x=x1+x2+3;
		y=y1+2;
		printf("%d %d\n",x,y);
		for(i=0;i<y;i++)
			printf("#");
		printf("\n");
		
		for(i=x1;i>=1;i--){
			for(j=0;j<y;j++){
				if(flag[i][j]==1)
					printf(".");
				else
					printf("#"); 
			}
			printf("\n");
		}
		
		for(i=0;i<=x2;i++){
			for(j=0;j<y;j++){
				if(vis[i][j]==1)
					printf(".");
				else
					printf("#"); 
			}
			printf("\n");
		}
		
		for(i=0;i<y;i++)
			printf("#");
		printf("\n");
	}
	
	return 0;
}

同时有简易方法:令FRBL分别为1234,next={{0,1},{1,0},{0,-1},{-1,0}},发现只要是顺时针转,每转90度,next数组的第一行变成最后一行,其余三行一次向上递增,则需要每次变换next数组即可;相对的一个方向位置发生了改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值