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