https://vjudge.net/problem/Gym-101512J
按题意模拟。
给定一个机器人。开始方向为->.
给定四个单词代表前进方向,前进的时候头也会跟着变。从初始点出发最后一定会回来,问你输出他的路径。
(考虑到最后一定会回来,那么直接模拟就好了。其实回来不回来都无所谓。)
开的数组大一点。然后直接暴力。
#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
bool a[maxn][maxn];
int ff;
int fx[5][2]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
//int fx[5][2]{{0,0},{0,1},{1,0},{0,-1},{-1,0}};
int solve(string s){
ff=1;
int x=105;
int y=105;
a[x][y]=true;
for(int i=0;i<s.length();i++){
if(s[i]=='F'){
a[x+fx[ff][0]][y+fx[ff][1]]=true;
x+=fx[ff][0];
y+=fx[ff][1];
//cout<<fx[ff][0]<<" "<<fx[ff][1]<<endl;
}
else if(s[i]=='B'){
a[x-fx[ff][0]][y-fx[ff][1]]=true;
x-=fx[ff][0];
y-=fx[ff][1];
if(ff==1) ff=3;
else if(ff==2) ff=4;
else if(ff==3) ff=1;
else if(ff==4) ff=2;
//cout<<fx[ff][0]<<" "<<fx[ff][1]<<endl;
}
else if(s[i]=='R'){
if(ff==1) ff=2;
else if(ff==2) ff=3;
else if(ff==3) ff=4;
else if(ff==4) ff=1;
a[x+fx[ff][0]][y+fx[ff][1]]=true;
x+=fx[ff][0];
y+=fx[ff][1];
//cout<<fx[ff][0]<<" "<<fx[ff][1]<<endl;
}
else if(s[i]=='L'){
if(ff==1) ff=4;
else if(ff==2) ff=1;
else if(ff==3) ff=2;
else if(ff==4) ff=3;
a[x+fx[ff][0]][y+fx[ff][1]]=true;
x+=fx[ff][0];
y+=fx[ff][1];
//cout<<fx[ff][0]<<" "<<fx[ff][1]<<endl;
}
}
}
bool ssx(int m){
for(int i=0;i<500;i++)
if(a[m][i]) return false;
return true;
}
bool ssy(int m){
for(int i=0;i<500;i++){
if(a[i][m]) return false;
}
return true;
}
int main()
{ int m;
//freopen("F:\\eee\\ee.txt","w",stdout);
string s;
scanf("%d",&m);
int cas=1;
while(m--){
cin>>s;
memset(a,false,sizeof(a));
solve(s);
int lef,rig;
int low,high;
for(int i=105;i>=0;i--){
if(ssx(i))
{low=i;break;}
}
for(int i=105;i<500;i++){
if(ssx(i))
{high=i;break;}
}
for(int i=105;i>=0;i--){
if(ssy(i))
{lef=i;break;}
}
if(cas==1)
printf("%d\n",m+1);
for(int i=105;i<500;i++){
if(ssy(i))
{rig=i;break;}
}
printf("%d %d\n",high-low+1,rig-lef);
for(int i=low;i<=high;i++){
for(int j=lef+1;j<=rig;j++){
if(a[i][j])
printf(".");
else
printf("#");
}
cout<<endl;
}
cas++;
}
return 0;
}