题目
以下图(a)所示的巧虎机器人有几种工作模式,其中行走编程模式具有简单的编程功能,能接收前进(F)、后退(B)、左转(L)、右转(R)四种指令,输入一系列指令,然后按下OK键,巧虎机器人就在图(b)所示的地图上从起始位置出发执行指令序列对应的动作,假定机器人最初的朝向是向北。输入地图(包含巧虎的起始位置)和指令序列,输出巧虎的最终位置和朝向。
【输入形式】
输入文件包含多个测试数据,每个测试数据包含3部分,第1部分占一行,为两个整数,M N(用空格隔开),2<M, N<=20,表示地图的行和列(行号和列号均从1开始计起);第2部分也占一行,为一行字符串,只包含F、B、L、R四种字符,表示巧虎机器人接收到的指令序列,长度不超过100个字符;第3部分占M行,每行有N个字符,这些字符可能为
点号“.”,表示可通行的方格;
字符“S”,表示巧虎机器人的起始位置;(测试数据保证地图中只有一个“S”)
字符“*”,表示障碍物,不可通行。
输入文件最后一行为“0 0”,代表输入结束。
注意:1) 如果接收到的指令为’B’(后退),则往当前朝向的反方向后退一个方格,但朝向不变;2) 巧虎机器人不能出边界,也不能进入到有障碍物的方格,因此如果执行一个指令后出边界了或进入了有障碍物的方格,则这个指令无效,跳过这个指令,继续执行下一个指令。
【输出形式】
对每个测试数据,输出占一行,为两个整数及一个字符,用空格隔开,表示巧虎机器人最后所处的位置(即行号和列号)及朝向。
注意:用n, e, s, w分别表示朝北、东、南、西。
【样例输入】
5 5
FFLRBFLLRBLLF
…
.*…
…S…
...
…*…
0 0
【样例输出】
1 4 e
很简单的一道模拟题 对于大马虎(我)很不友好的题,模拟题就是按照按照题目说的一步步去实现就行 ,说难也难,说简单也简单
模拟题写代码之前要构思好完整的框架,不要边写边构思!!!!!
代码一
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char map[30][30];
int bi,bj;
int aim;//方向
int dir[4][2]={
{
-1,0},{
1,0},{
0,-1},{
0,1}};//方向数组
//1上 2下 3左 4右,个人习惯
void f()//将功能函数化,可读性更强
{
int ii=bi+dir[aim-1][0];
int jj=bj+dir[aim-1][1];
if(ii>=1&&jj>=1&&ii<=n&&jj<=m&&map[ii][jj]!='*')
{
bi=ii;
bj=jj;
}
}
void b()
{
int ii=bi-dir[aim-1][0];
int jj=bj-dir[aim-1][1];
if(ii>=1&&jj>=1&&ii<=n&&jj<=m&&map[ii][jj]=='.')
{
bi=ii;
bj=jj;
}
}
void ll()
{
if(aim==1)aim=3;
else if(aim==2)aim=4;
else if(aim==3)aim=2;
else aim=1;
}
void r()
{
if(aim==1)aim=4;
else if(aim==2)aim=3;
else if(aim==3)aim=1;
else aim=2;
}
int main()
{
while(1)
{
cin>>n>>m;
if(n==0)return 0;
string str;
cin>>str;//对于未知长度的字串,建议用cin>>string的方式读取
char c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c;//cin会自动忽略掉空格回车
//由于cin对象是char,cin一次只会读入一个字符
if(c=='S')
{
bi=i;bj=j;
map[i][j]='.';
}
else map[i][j]=c;
//cout<<map[i][j]<<" ";用这个可以检查读取的数据是否正常
}
//cout<<endl;
}
aim=1;//设定初始方向
int l=str.length();
for(int i=0;i<l;i++)
{
if(str[i]=='F')f();
else if(str[i]=='B')b();
else if(str[i]=='L')ll();
else r();
//cout<<str[i]<<" "<<bi<<" "<<bj<<" "<<aim<<endl;
//当遇到未知的错误时,可以用这种方式来追踪每一步的运动
}
cout<<bi<<" "<<bj<<" ";
if(aim==1)cout<<'n'<<endl;//这判断方式有点傻fufu的
else if(aim==2)cout<<'s'<<endl;
else if(aim==3)cout<<'w'<<endl;
else cout<<'e'<<endl;
}
}
代码二
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int m,n;
while(cin>>m>>n)
{
int i,j;
char direction[]={
'n','w','s','e'};
int d=0; //记录初始方向
char map[30][30];
int x=0,y=0; //记录初始位置
fill(map[0],map[0]+30*30,'*');
if(m==0&&n==0)break;
string command;
cin>>command;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
cin>>map[i][j]; //记录地图信息到数组中同时找到初始位置
if(map[i][j]=='S')
{
x=i;y=j;
}
}
}
//开始执行指令
int l=command.length();
for(int turn=0;turn<l;turn++)
{
if(command[turn]=='F')
{
if(direction[d]=='n'&&map[x-1][y]!='*')
{
x--;
}
else if(direction[d]=='s'&&map[x+1][y]!='*')
{
x++;
}
else if(direction[d]=='w'&&map[x][y-1]!='*')
{
y--;
}
else if(direction[d]=='e'&&map[x][y+1]!='*')
{
y++;
}
}
else if(command[turn]=='B')
{
if(direction[d]=='n'&&map[x+1][y]!='*')
{
x++;
}
else if(direction[d]=='s'&&map[x-1][y]!='*')
{
x--;
}
else if(direction[d]=='w'&&map[x][y+1]!='*')
{
y++;
}
else if(direction[d]=='e'&&map[x][y-1]!='*')
{
y--;
}
}
else if(command[turn]=='L'){
d=(d+1)%4;
}
else if(command[turn]=='R'){
d=(d+3)%4;
}
}
//输出最终结果
cout<<x<<" "<<y<<" "<<direction[d]<<endl;
}
return 0;
}