题目描述
电子信息课程上,老师带着同学们做了一款智能机器人,并为机器人注入了蓝牙控制程序。
蓝牙的另一端,链接到了计算机上,可以通过计算机的 4 个按钮:w、s、a、d,分别控制机器人上、下、左、右移动一个格子。
现将机器人放到一个 n × m 大小的网格中,并在网格中设置了一些障碍。机器人安有红外设备,可以轻松的识别障碍和边界。你给机器人下指令后,机器人识别出如果执行该指令会出网格边界,或者会碰到障碍,机器人会忽略该指令。
在网格中,有一个目标点 P,现给定要给机器人执行的指令字符串,请编程计算:
机器人会走过多少个不同的格子(含起点的第1个格子);
1.机器人是否会经过设置好的目标点 P?
2.机器人是否会经过设置好的目标点 P?
输入
第一行两个数 n ,m ,分别表示网格的行数和列数。
接下来 n 行,每行 m 个字符,其中字符'a'表示机器人的出发位置,字符'.'表示该点无障碍,字符'*'表示该点是障碍,字符'b'表示目标点 PP。
最后一行,输入一行仅包含'w'、's'、'a'、'd'四种字符的字符串,字符串长度不超过 5000。
输出
第 1 行输出 1 个整数,表示机器人经过的格子的总数。
第 2 输出 YES 或者 NO,如果机器人经过了目标点,请输出 YES,如果机器人无法经过目标点,请输出 NO。
样例输入
8 8
.a......
.****...
......*.
.......*
.......*
....b.*.
........
........
asssssdddd
样例输出
11
YES
数据范围
20% 的数据,n≤10,m≤10。
60% 的数据,n≤100,m≤100。
100% 的数据,n≤2000,m≤2000。
我的代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[2010][2010];
string s;
bool f[2010][2010],flag;
int main(){
int i,j,k=0,x,y,x1,y1;
cin>>n>>m;
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
cin>>a[i][j];
if(a[i][j]=='a'){
x1=i;
y1=j;
}
}
}x=x1;
y=y1;
f[x1][y1]=true;
cin>>s;
for(i=0;i<s.size();++i){
if(s[i]=='w'&&x-1>=1&&a[x-1][y]!='*'){
--x;
f[x][y]=true;
if(a[x][y]=='b'){
flag=true;
break;
}
}if(s[i]=='s'&&x+1<=n&&a[x+1][y]!='*'){
++x;
f[x][y]=true;
if(a[x][y]=='b'){
flag=true;
break;
}
}if(s[i]=='a'&&y-1>=1&&a[x][y-1]!='*'){
--y;
f[x][y]=true;
if(a[x][y]=='b'){
flag=true;
break;
}
}if(s[i]=='d'&&y+1<=m&&a[x][y+1]!='*'){
++y;
f[x][y]=true;
if(a[x][y]=='b'){
flag=true;
break;
}
}
}for(i=1;i<=n;++i)for(j=1;j<=m;++j)if(f[i][j]==true)++k;
if(flag==true)printf("%d\nYES",k);
else printf("%d\nNO",k);
return 0;
}