Robot Motion
题目大意是:有一个机器人按照一定的程序进行移动,当遇到“S”时,机器人向下移动一位,“N”向上移动一位,“W”向左移动一位,“E”向右移动一位。给定一个区域,长len1,宽为len2,用一个二维字符串数组表示机器人所在的区域,起始机器人在第一行的loc位置,求解机器人走出这个区域的步数m,或者在区域内形成一个圈时,即当机器人走不出这片区域时,求解出踏入循环前的步数x和循环的步数y。
输入:输入三个整型数,len1,len2,loc分别代表区域的长、宽和机器人所在的位置(注意位置是从一开始计算的),当len1,len2,loc都为0时结束输入。
输出:当能走出区域时输出m step(s) to exit;当走不出去时输出 x step(s) before a loop of y step(s)。
样例:
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0
解题思路:定义二维字符串数组a[20][20]表示区域,定义二维数组b[20][20]表示走到每一个位置的步数。初始化
b[20][20]为0,用b[i+1][j+1]表示走到a[i][j]位置的步数。当每次改变方向时,b[i+1][j+1]的大小与出了改变方向外三个位置的步数大小有关,即当遇到“W”时,b[i+1][j+1]与b[i][j+1]、b[i+1][j+2]和b[i+2][j+1]有关,其关系是b[i+1][j+1]=max(max(b[i][j+1],b[i+2][j+1]),b[i+1][j+2])+1,由此可以进行编写代码了,我的代码如下:#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char com[100][100];
int step,i,j,k,low,hig,loc,b[100][100];
while(cin>>low>>hig>>loc&&low!=0&&hig!=0&&loc!=0)
{
bool ju=true;//定义一个bool变量表示机器人能否走出区域
for(k=0;k<low;k++)
cin>>com[k];
step=0;
i=0;j=loc-1;
memset(b,0,sizeof(b));//初始化b中的所有元素为“0”
while(i>=0&&i<low&&j>=0&&j<hig)
{
if(com[i][j]=='S')
{
b[i+1][j+1]=max(max(b[i][j+1],b[i+1][j]),b[i+1][j+2])+1;//根据解题思路找出b[i+1][j+1]
com[i][j]='1';//如果一个位置走过,留下特别标记“1”,以方便在出现loop时找到出口
i+=1;step++;
if(com[i][j]=='1')//寻找出口
{cout<<b[i+1][j+1]-1<<" step(s) before a loop of "<<step-b[i+1][j+1]+1<<" step(s)"<<endl;ju=false;break;}
else continue;}
if(com[i][j]=='N')
{
b[i+1][j+1]=max(max(b[i+2][j+1],b[i+1][j]),b[i+1][j+2])+1;
com[i][j]='1';
i-=1;step++;
if(com[i][j]=='1')
{cout<<b[i+1][j+1]-1<<" step(s) before a loop of "<<step-b[i+1][j+1]+1<<" step(s)"<<endl;ju=false;break;}
else continue;}
if(com[i][j]=='E')
{
b[i+1][j+1]=max(max(b[i][j+1],b[i+2][j+1]),b[i+1][j])+1;
com[i][j]='1';
j+=1;step++;
if(com[i][j]=='1'){cout<<b[i+1][j+1]-1<<" step(s) before a loop of "<<step-b[i+1][j+1]+1<<" step(s)"<<endl;ju=false;break;}
else continue;}
if(com[i][j]=='W')
{
b[i+1][j+1]=max(max(b[i][j+1],b[i+2][j+1]),b[i+1][j+2])+1;
com[i][j]='1';
j-=1;step++;
if(com[i][j]=='1'){cout<<b[i+1][j+1]-1<<" step(s) before a loop of "<<step-b[i+1][j+1]+1<<" step(s)"<<endl;ju=false;break;}
else continue;}
}
if(ju)cout<<step<<" step(s) to exit"<<endl;
}
return 0;
}
浙公网安备 33010602011771号