Solução do problema do modo de programação de caminhada do robô Qiaohu

Tópico
O robô Qiaohu mostrado na figura abaixo (a) possui vários modos de trabalho, entre eles, o modo de programação de caminhada possui uma função de programação simples, que pode receber para frente (F), para trás (B), giro à esquerda (L), à direita vire (R).) Quatro tipos de instruções, insira uma série de instruções e pressione o botão OK. O robô Qiaohu executará as ações correspondentes à sequência de instruções a partir da posição inicial no mapa mostrado na Figura (b) . Insira o mapa (incluindo a posição inicial de Qiaohu) e a sequência de comandos, e exiba a posição e orientação finais de Qiaohu.

[Formulário de entrada]

O arquivo de entrada contém vários dados de teste, cada dado de teste contém 3 partes, a primeira parte ocupa uma linha, são dois inteiros, MN (separados por um espaço), 2 <M, N <= 20, indicando a linha e coluna do map (O número da linha e o número da coluna são contados a partir de 1); A segunda parte também ocupa uma linha, que é uma linha de string de caracteres, que contém apenas quatro caracteres de F, B, L e R, indicando a sequência de instruções recebido pelo robô Qiaohu, e o comprimento Não mais do que 100 caracteres; a terceira parte ocupa M linhas, cada linha tem N caracteres, esses caracteres podem ser

O ponto "." Indica um quadrado passável;

O caractere "S" indica a posição inicial do robô Qiaohu; (os dados de teste garantem que haja apenas um "S" no mapa)

O caractere "*" indica um obstáculo e não é transitável.

A última linha do arquivo de entrada é "0 0", que representa o fim da entrada.

Nota: 1) Se o comando recebido for 'B' (voltar), então volte um quadrado na direção oposta da direção atual, mas a direção permanece a mesma; 2) Os robôs Qiaohu não podem sair do limite ou entrar em obstáculos Portanto, se você sair da fronteira ou entrar em um quadrado com obstáculos após executar uma instrução, esta instrução é inválida, pule esta instrução e continue a executar a próxima instrução.

【Formulário de saída】

Para cada dado de teste, a saída ocupa uma linha, que é dois inteiros e um caractere, separados por espaços, para indicar a última posição (número da linha e número da coluna) e orientação do robô Qiaohu.

Nota: Use n, e, s, w para indicar norte, leste, sul e oeste, respectivamente.

【Amostra de entrada】

5 5

FFLRBFLLRBLLF

. * ...

… S…

. . .

… *…

0 0

[Exemplo de saída]

1 4 e

Uma pergunta de simulação muito simples. Para a pergunta desleixada (eu) muito hostil, a pergunta de simulação pode ser implementada passo a passo de acordo com o tópico. É difícil dizer, simples e simples.
Antes de escrever o código , a pergunta de simulação deve ser bem pensado. Frame, não pense enquanto escreve! ! ! ! !
Código um

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

    }
}

Código dois

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

Acho que você gosta

Origin blog.csdn.net/fdxgcw/article/details/115283690
Recomendado
Clasificación