题目买描述: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数组即可;相对的一个方向位置发生了改变。