Qiaohuロボット歩行プログラミングモードの問題解決

トピック
下図(a)に示すQiaohuロボットには、いくつかの動作モードがありますが、ウォーキングプログラミングモードには、前方(F)、後方(B)、左折(L)、右を受信できる単純なプログラミング機能があります。 (R)を回します。)4種類の命令、一連の命令を入力し、OKボタンを押します。Qiaohuロボットは、図(b)に示すマップの開始位置から一連の命令に対応するアクションを実行します。 、ロボットの初期方向が北であると仮定します。マップ(Qiaohuの開始位置を含む)とコマンドシーケンスを入力し、Qiaohuの最終的な位置と方向を出力します。

【入力フォーム】

入力ファイルには複数のテストデータが含まれ、各テストデータには3つの部分が含まれ、最初の部分は1行を占め、2つの整数、MN(スペースで区切られます)、2 <M、N <= 20であり、の行と列を示します。マップ(行番号と列番号は1から数えられます); 2番目の部分も1行を占めます。これは、命令のシーケンスを示すF、B、L、およびRの4文字のみを含む文字列の行です。 Qiaohuロボットによって受信され、長さは100文字以下です。3番目の部分はM行を占め、各行にはN文字があり、これらの文字は次のようになります。

ドット「。」は、合格の正方形を示します。

文字「S」はQiaohuロボットの開始位置を示します;(テストデータは、マップに「S」が1つしかないことを確認します)

文字「*」は障害物を示し、通行できません。

入力ファイルの最後の行は「00」で、入力の終わりを表します。

注:1)受信したコマンドが「B」(戻る)の場合、現在の方向とは反対の方向に1マス戻りますが、方向は同じです。2)Qiaohuロボットは、境界から出たり、障害物に入ることができません。したがって、命令実行後に国境を越えたり、障害物のある四角に入ったりした場合、この命令は無効となり、この命令をスキップして次の命令を実行し続けます。

【出力フォーム】

テストデータごとに、出力は1行を占めます。これは2つの整数と1文字で、スペースで区切られ、Qiaohuロボットの最後の位置(行番号と列番号)と方向を示します。

注:n、e、s、wを使用して、それぞれ北、東、南、西を示します。

【サンプル入力】

5 5

FFLRBFLLRBLLF

。*…

…S…

…*…

0 0

【サンプル出力】

1 4 e

非常に単純なシミュレーションの質問。ずさんな(私)非常に不親切な質問の場合、シミュレーションの質問はトピックに応じて段階的に実装できます。単純で単純なことを言うのは難しいです。
コードを書く前に、シミュレーションの質問は次のようになります。フレーム、書いている間は考えないください!
コード1

#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;

    }
}

コード2

#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