站外题求调
  • 板块题目总版
  • 楼主AFO_wyx
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/22 15:36
  • 上次更新2023/10/27 18:54:43
查看原帖
站外题求调
737939
AFO_wyx楼主2022/7/22 15:36

题目描述

电子信息课程上,老师带着同学们做了一款智能机器人,并为机器人注入了蓝牙控制程序。

蓝牙的另一端,链接到了计算机上,可以通过计算机的 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。

用于表示指令的字符串长度 ≤ 5000。

我的代码:

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

在线等,急!

2022/7/22 15:36
加载中...