巧虎机器人——行走编程模式 题解

题目
以下图(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;
}

猜你喜欢

转载自blog.csdn.net/fdxgcw/article/details/115283690